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 相关文章推荐
将图片文件嵌入到wxpython代码中的实现方法
Aug 11 Python
python通过smpt发送邮件的方法
Apr 30 Python
Python读取指定目录下指定后缀文件并保存为docx
Apr 23 Python
python实现单线程多任务非阻塞TCP服务端
Jun 13 Python
flask入门之文件上传与邮件发送示例
Jul 18 Python
基于python if 判断选择结构的实例详解
May 06 Python
使用 PyTorch 实现 MLP 并在 MNIST 数据集上验证方式
Jan 08 Python
Python 格式化打印json数据方法(展开状态)
Feb 27 Python
python小程序之4名牌手洗牌发牌问题解析
May 15 Python
python神经网络编程实现手写数字识别
May 27 Python
PyQt5中QSpinBox计数器的实现
Jan 18 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
Jun 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上的memcache和memcached两个pecl库
2010/03/29 PHP
AJAX的跨域访问-两种有效的解决方法介绍
2013/06/22 PHP
php使用function_exists判断函数可用的方法
2014/11/19 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
tp5框架内使用tp3.2分页的方法分析
2019/05/05 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
prototype Element学习笔记(篇二)
2008/10/26 Javascript
prototype Element学习笔记(Element篇三)
2008/10/26 Javascript
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
jQuery之$(document).ready()使用介绍
2012/04/05 Javascript
JavaScript使用cookie实现记住账号密码功能
2015/04/27 Javascript
JS数组搜索之折半搜索实现方法分析
2017/03/27 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
angularjs 的数据绑定实现原理
2018/07/02 Javascript
JavaScript函数定义方法实例详解
2019/03/05 Javascript
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
NodeJS和浏览器中this关键字的不同之处
2021/03/03 NodeJs
Python标准库defaultdict模块使用示例
2015/04/28 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
2016/06/29 Python
Python之Web框架Django项目搭建全过程
2017/05/02 Python
python获取txt文件词向量过程详解
2019/07/05 Python
virtualenv介绍及简明教程
2020/06/23 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
NYX Professional Makeup俄罗斯官网:世界知名的化妆品品牌
2019/12/26 全球购物
《湘夫人》教学反思
2014/02/21 职场文书
《鸟的天堂》教学反思
2014/02/27 职场文书
销售团队口号大全
2014/06/06 职场文书
音乐节策划方案
2014/06/09 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
黄石寨导游词
2015/02/05 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书
Python还能这么玩之用Python做个小游戏的外挂
2021/06/04 Python