Python3压缩和解压缩实现代码


Posted in Python onMarch 01, 2021

一、说明

压缩和解压缩是日常常用的操作,不管是windows上图形界面的操作,还是linux上用命令来进行压缩解压缩,总的而言都还是比较方便的。

但用代码来实现就没做过,近期也得实现代码压缩与解压缩操作,所以就抽时间来研究一下。

二、zip文件压缩和解压缩实现

import os
import zipfile

# 函数功能是zip_file_list所有文件,和zip_dir_list所有目录下的所有文件,被压缩到一个zip_file_name的压缩文件中
def my_zip_function(zip_file_name, zip_file_list=[], zip_dir_list=[]):
  # 压缩文件最后需要close,为了方便我们直接用with
  with zipfile.ZipFile(zip_file_name, "w") as zip_obj:
    # 压缩文件
    for tmp_file in zip_file_list:
      zip_obj.write(tmp_file)
    # 压缩目录
    for tmp_dir in zip_dir_list:
      # zipfile没有直接压缩目录的功能,要压缩目录只能遍历目录一个一个文件压。
      for root, dirs, files in os.walk(tmp_dir):
        # 如果想要目录为空时仍将该目录压缩进去,该目录也要压缩一遍;反之请将以下行注释掉
        zip_obj.write(root)
        for tmp_file in files:
          # 拼接文件完整目录,不然只用文件名代码找不到文件
          tmp_file_path = os.path.join(root, tmp_file)
          zip_obj.write(tmp_file_path)


# 函数功能是遍历压缩文件中的所有文件
def my_traversal_zip_function(zip_file_name):
  with zipfile.ZipFile(zip_file_name, "r") as zip_obj:
    # 返回结果是一个ZipInfo列表
    # 如果在压缩时显示压缩目录,则目录也作为一个单独的ZipInfo呈现在列表中;反之则没有目录的ZipInfo
    all_file_list = zip_obj.infolist()
    for tmp_file in all_file_list:
      print(tmp_file.filename)
      # 还可以在不解压的情况下直接读取文件的内容
      # 可以通过ZipInfo.is_dir()来区分是文件还是目录
      # if not tmp_file.is_dir():
      #   with zip_obj.open(tmp_file) as zip_fd:
      #     print(zip_fd.read())

# 函数的功能是将压缩文件直接解压
def my_unzip_function(zip_file_name, path="."):
  with zipfile.ZipFile(zip_file_name, "r") as zip_obj:
    zip_obj.extractall(path=path)

if __name__ == "__main__":
  zip_file_name = "test_zip.zip"
  # 自己在测试时要先自行创建好要压缩的文件和目录
  zip_file_list = ["test_tar_file1.txt", "test_tar_file2.txt"]
  zip_dir_list = ["test_tar_dir"]
  my_zip_function(zip_file_name, zip_file_list, zip_dir_list)
  my_traversal_zip_function(zip_file_name)
  # my_unzip_function(zip_file_name, path=".")

三、tar文件的压缩与解压缩实现

除了直接的.tar文件,还包括.tar.gz/.tar.bz2/.tar.xz等格式文件的压缩与解压缩实现。

import os
import tarfile

# Python学习交流群:778463939
# 函数功能是tar_file_list所有文件,和tar_dir_list所有目录下的所有文件,被压缩到一个tar_file_name的压缩文件中
def my_tar_function(tar_file_name, tar_file_list=[], tar_dir_list=[], model="w"):
  # 本来也应该是tarfile.TarFile(tar_file_name, model)来创建的,但TarFile不支持"r:gz"等扩展形式
  # 压缩文件最后需要close,为了方便我们直接用with
  with tarfile.open(tar_file_name, model) as tar_obj:
    # 压缩文件
    for tmp_file in tar_file_list:
      tar_obj.add(tmp_file)
    # 压缩目录。和zipfile相比tarfile允许直接压缩目录,而不需要去遍历目录一个个文件压
    for tmp_dir in tar_dir_list:
      tar_obj.add(tmp_dir)


# 函数功能是遍历压缩文件中的所有文件
def my_traversal_tar_function(tar_file_name, model="r"):
  with tarfile.open(tar_file_name, model) as tar_obj:
    # 返回结果是一个TarInfo列表
    all_file_list = tar_obj.getmembers()
    for tmp_file in all_file_list:
      print(tmp_file.name)
      # 还可以在不解压的情况下直接读取文件的内容
      # 可以通过TarInfo.isdir()来区分是文件还是目录
      # if not tmp_file.isdir():
      #   # 相当于zip的open,并不会把文件给解压出来
      #   tar_fd = tar_obj.extractfile(tmp_file)
      #   print(tar_fd.read())


# 函数的功能是将压缩文件直接解压
def my_untar_function(tar_file_name, path=".", model="r"):
  with tarfile.open(tar_file_name, model) as tar_obj:
    tar_obj.extractall(path=path)


if __name__ == "__main__":
  # 自己在测试时要先自行创建好要压缩的文件和目录
  tar_file_list = ["test_tar_file1.txt", "test_tar_file2.txt"]
  tar_dir_list = ["test_tar_dir"]
  tar_file_name = "test_tar.tar"
  # 在.tar基础上,tarfile还支持gz/bz2/xz的压缩,只要在原来打开模式的基础上使用:或|接上压缩方法即可,如"r:gz"
  # 特别的,如果是读取文件,可以使用"r:*"来指示尝试以任意格式读取
  open_model = "w"
  # open_model = "w:gz"
  my_tar_function(tar_file_name, tar_file_list, tar_dir_list, model=open_model)
  open_model = "r"
  # open_model = "r:*"
  my_traversal_tar_function(tar_file_name, model=open_model)
  # open_model = "r:*"
  # my_untar_function(tar_file_name, path=".", model=open_model)

到此这篇关于Python3压缩和解压缩实现代码的文章就介绍到这了,更多相关Python3压缩和解压缩内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
从零学Python之引用和类属性的初步理解
May 15 Python
python有证书的加密解密实现方法
Nov 19 Python
Python的Flask框架中实现登录用户的个人资料和头像的教程
Apr 20 Python
Python环境变量设置方法
Aug 28 Python
Python排序搜索基本算法之归并排序实例分析
Dec 08 Python
TensorFlow平台下Python实现神经网络
Mar 10 Python
Python元组拆包和具名元组解析实例详解
Mar 26 Python
python 模拟贷款卡号生成规则过程解析
Aug 30 Python
18个Python脚本可加速你的编码速度(提示和技巧)
Oct 17 Python
python飞机大战pygame游戏背景设计详解
Dec 17 Python
浅谈ROC曲线的最佳阈值如何选取
Feb 28 Python
如何完美的建立一个python项目
Oct 09 Python
python re模块常见用法例举
Mar 01 #Python
Python实现简单的2048小游戏
Mar 01 #Python
Python使用Turtle模块绘制国旗的方法示例
Feb 28 #Python
Python页面加载的等待方式总结
Feb 28 #Python
Python Selenium操作Cookie的实例方法
Feb 28 #Python
Python Selenium异常处理的实例分析
Feb 28 #Python
python常量折叠基础知识点讲解
Feb 28 #Python
You might like
PHP下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
php图片添加文字水印实现代码
2016/03/15 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
PHP7 标准库修改
2021/03/09 PHP
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
2013/07/18 Javascript
jQuery中的编程范式详解
2014/12/15 Javascript
jquery中animate的stop()方法作用实例分析
2015/01/30 Javascript
javascript使用shift+click实现选择和反选checkbox的方法
2015/05/04 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
微信小程序 wx.uploadFile在安卓手机上面the same task is working问题解决
2016/12/14 Javascript
loading动画特效小结
2017/01/22 Javascript
基于JavaScript实现淘宝商品广告效果
2017/08/10 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
2017/10/18 Javascript
django输出html内容的实例
2018/05/27 Python
python微信撤回监测代码
2019/04/29 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
Pytorch实现GoogLeNet的方法
2019/08/18 Python
Python函数的定义方式与函数参数问题实例分析
2019/12/26 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
2020/01/06 Python
python代数式括号有效性检验示例代码
2020/10/04 Python
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
旅游业大学生创业计划书
2014/01/31 职场文书
水利公司纪检监察自我鉴定
2014/02/25 职场文书
2014年底个人工作总结
2015/03/10 职场文书
导游词之峨眉山
2019/12/16 职场文书
Django模型层实现多表关系创建和多表操作
2021/07/21 Python
java设计模式--三种工厂模式详解
2021/07/21 Java/Android
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android
Java面试题冲刺第十六天--消息队列
2021/08/07 面试题
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript