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设计模式之观察者模式实例
Apr 26 Python
python实现得到一个给定类的虚函数
Sep 28 Python
pymssql数据库操作MSSQL2005实例分析
May 25 Python
Python SQL查询并生成json文件操作示例
Aug 17 Python
深入解析python中的实例方法、类方法和静态方法
Mar 11 Python
超简单的Python HTTP服务
Jul 22 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
Aug 02 Python
扩展Django admin的list_filter()可使用范围方法
Aug 21 Python
Python+OpenCv制作证件图片生成器的操作方法
Aug 21 Python
mac在matplotlib中显示中文的操作方法
Mar 06 Python
浅谈在JupyterNotebook下导入自己的模块的问题
Apr 16 Python
如何在mac版pycharm选择python版本
Jul 21 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初学者头疼问题总结
2006/07/08 PHP
PHP分页显示制作详细讲解
2006/12/05 PHP
PHPMyAdmin 快速配置方法
2009/05/11 PHP
PHP MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
2015/04/27 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
2015/11/05 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
解决微信授权回调页面域名只能设置一个的问题
2016/12/11 PHP
Prototype Date对象 学习
2009/07/12 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
2014/03/12 Javascript
单击某一段文字改写文本颜色
2014/06/06 Javascript
javascript获取dom的下一个节点方法
2014/09/05 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
Windows环境下npm install 报错: operation not permitted, rename的解决方法
2016/09/26 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
JS脚本实现网页自动秒杀点击
2018/01/11 Javascript
详解angular部署到iis出现404解决方案
2018/08/14 Javascript
[46:53]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python中对列表排序实例
2015/01/04 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
python框架django基础指南
2016/09/08 Python
详解Python用户登录接口的方法
2019/04/17 Python
PyQt5 多窗口连接实例
2019/06/19 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
Python with关键字,上下文管理器,@contextmanager文件操作示例
2019/10/17 Python
Python 中 -m 的典型用法、原理解析与发展演变
2019/11/11 Python
python 消费 kafka 数据教程
2019/12/21 Python
python+adb命令实现自动刷视频脚本案例
2020/04/23 Python
英国虚拟主机服务商:eUKhost
2016/08/16 全球购物
中学生爱国演讲稿
2014/09/05 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
实习计划书范文
2015/01/16 职场文书
老干部座谈会主持词
2015/07/03 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
python ConfigParser库的使用及遇到的坑
2022/02/12 Python