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实现的生成自我描述脚本分享(很有意思的程序)
Jul 18 Python
使用Python写CUDA程序的方法
Mar 27 Python
Python标准库之itertools库的使用方法
Sep 07 Python
Python使用paramiko操作linux的方法讲解
Feb 25 Python
python 求某条线上特定x值或y值的点坐标方法
Jul 09 Python
ubuntu上安装python的实例方法
Sep 30 Python
python处理excel绘制雷达图
Oct 18 Python
pandas中read_csv的缺失值处理方式
Dec 19 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
May 22 Python
Python自定义聚合函数merge与transform区别详解
May 26 Python
Python工程师必考的6个经典面试题
Jun 28 Python
Django封装交互接口代码
Jul 12 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分页代码学习示例分享
2014/02/20 PHP
PHP实现根据银行卡号判断银行
2015/04/29 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
2018/10/10 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
2014/02/24 Javascript
在Firefox下js select标签点击无法弹出
2014/03/06 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
2014/08/18 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
原生js轮播(仿慕课网)
2017/02/15 Javascript
layui 给数据表格加序号的方法
2018/08/20 Javascript
微信小程序自定义键盘 内部虚拟支付
2018/12/20 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
python目录与文件名操作例子
2016/08/28 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
python 获取sqlite3数据库的表名和表字段名的实例
2019/07/17 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
python interpolate插值实例
2020/07/06 Python
Python selenium如何打包静态网页并下载
2020/08/12 Python
实习自我鉴定范文
2013/10/30 职场文书
绩效工资分配方案
2014/01/18 职场文书
本科生职业生涯规划书范文
2014/01/21 职场文书
初中生期末评语大全
2014/04/24 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
2015年质量管理工作总结范文
2015/05/18 职场文书
安全温馨提示语大全
2015/07/14 职场文书
2015中学教学工作总结
2015/07/22 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL