python 实现压缩和解压缩的示例


Posted in Python onSeptember 22, 2020

一、说明

压缩和解压缩是日常常用的操作,不管是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


# 函数功能是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)

参考:

https://docs.python.org/3/library/zipfile.html#module-zipfile

以上就是python 实现压缩和解压缩的示例的详细内容,更多关于Python 压缩和解压缩的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中多线程及程序锁浅析
Jan 21 Python
python使用post提交数据到远程url的方法
Apr 29 Python
深入解析Python中函数的参数与作用域
Mar 20 Python
Python脚本实现Web漏洞扫描工具
Oct 25 Python
python验证码识别教程之滑动验证码
Jun 04 Python
python hbase读取数据发送kafka的方法
Dec 27 Python
对Xpath 获取子标签下所有文本的方法详解
Jan 02 Python
python实现文件助手中查看微信撤回消息
Apr 29 Python
python超时重新请求解决方案
Oct 21 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
Jun 08 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
Dec 04 Python
python 无损批量压缩图片(支持保留图片信息)的示例
Sep 22 #Python
Pytho爬虫中Requests设置请求头Headers的方法
Sep 22 #Python
python 线程的五个状态
Sep 22 #Python
python 如何实现遗传算法
Sep 22 #Python
利用python汇总统计多张Excel
Sep 22 #Python
爬虫代理的cookie如何生成运行
Sep 22 #Python
python 如何将office文件转换为PDF
Sep 22 #Python
You might like
最小化数据传输――在客户端存储数据
2006/10/09 PHP
PHP5 面向对象程序设计
2008/02/13 PHP
浅谈PHP与C#的值类型指向区别的详解
2013/05/21 PHP
php递归使用示例(php递归函数)
2014/02/14 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
Laravel搭建后台登录系统步骤详解
2016/07/26 PHP
[对联广告] JS脚本类
2006/08/27 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
js验证上传图片的方法
2015/05/12 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
2015/07/01 Javascript
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
javascript跨域总结之window.name实现的跨域数据传输
2015/11/01 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
vue-cli项目配置多环境的详细操作过程
2018/10/30 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
JavaScript实现拖动对话框效果的实现代码
2020/10/12 Javascript
Nest.js散列与加密实例详解
2021/02/24 Javascript
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
详解Python下ftp上传文件linux服务器
2018/06/21 Python
git查看、创建、删除、本地、远程分支方法详解
2020/02/18 Python
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
计算机应用职专应届生求职信
2013/11/12 职场文书
初中校园之声广播稿
2014/01/15 职场文书
益达广告词
2014/03/14 职场文书
学生个人自我鉴定范文
2014/03/28 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
成绩单评语
2015/01/04 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
Python实现简繁体转换
2021/06/07 Python
springcloud之Feign超时问题的解决
2021/06/24 Java/Android