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自定义scrapy中间模块避免重复采集的方法
Apr 07 Python
简述Python中的面向对象编程的概念
Apr 27 Python
判断网页编码的方法python版
Aug 12 Python
详解python 发送邮件实例代码
Dec 22 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
使用anaconda的pip安装第三方python包的操作步骤
Jun 11 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
Oct 29 Python
python字符串循环左移
Mar 08 Python
python实现两个dict合并与计算操作示例
Jul 01 Python
python实现二分类的卡方分箱示例
Nov 22 Python
Python中用xlwt制作表格实例讲解
Nov 05 Python
Python中rapidjson参数校验实现
Jul 25 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
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
100行PHP代码实现socks5代理服务器
2016/04/28 PHP
PHP数据库处理封装类实例
2016/12/24 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
js自定义事件代码说明
2011/01/31 Javascript
jQuery contains过滤器实现精确匹配使用方法
2013/04/12 Javascript
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
js中style.display=""无效的解决方法
2014/10/30 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
ES6新特性八:async函数用法实例详解
2017/04/21 Javascript
vue-cli脚手架config目录下index.js配置文件的方法
2018/03/13 Javascript
在Vue mounted方法中使用data变量详解
2019/11/05 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
Python简单日志处理类分享
2015/02/14 Python
Python实现身份证号码解析
2015/09/01 Python
详解Python nose单元测试框架的安装与使用
2017/12/20 Python
Zookeeper接口kazoo实例解析
2018/01/22 Python
Python切片索引用法示例
2018/05/15 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
python 定时器,实现每天凌晨3点执行的方法
2019/02/20 Python
Python面向对象之类和实例用法分析
2019/06/08 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
简单了解Python write writelines区别
2020/02/27 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
django模板获取list中指定索引的值方式
2020/05/14 Python
python exit出错原因整理
2020/08/31 Python
numba提升python运行速度的实例方法
2021/01/25 Python
英国网上花店:Bunches
2016/11/29 全球购物
竞聘演讲稿怎么写
2014/08/28 职场文书
仓库保管员岗位职责
2015/02/09 职场文书
北大自主招生自荐信
2015/03/04 职场文书
常用的Python代码调试工具总结
2021/06/23 Python