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中wx将图标显示在右下角的脚本代码
Mar 08 Python
python遍历数组的方法小结
Apr 30 Python
Python中转换角度为弧度的radians()方法
May 18 Python
在Python中操作文件之truncate()方法的使用教程
May 25 Python
Python编程实现删除VC临时文件及Debug目录的方法
Mar 22 Python
梯度下降法介绍及利用Python实现的方法示例
Jul 12 Python
python 实时得到cpu和内存的使用情况方法
Jun 11 Python
Python面向对象程序设计多继承和多态用法示例
Apr 08 Python
用django设置session过期时间的方法解析
Aug 05 Python
PyTorch预训练的实现
Sep 18 Python
浅谈Python中的函数(def)及参数传递操作
May 25 Python
自动在Windows中运行Python脚本并定时触发功能实现
Sep 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
php日期转时间戳,指定日期转换成时间戳
2012/07/17 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
2013/06/20 PHP
Laravel 5框架学习之Laravel入门和新建项目
2015/04/07 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
jQuery toggle()设置CSS样式
2009/11/05 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
2013/04/26 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
2014/01/11 Javascript
AngularJS基础学习笔记之简单介绍
2015/05/10 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
js实现延时加载Flash的方法
2015/11/26 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
JavaScript实现获取远程的html到当前页面中
2017/03/26 Javascript
基于angular实现模拟微信小程序swiper组件
2017/06/11 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
实例分析javascript中的异步
2020/06/02 Javascript
Nuxt配置Element-UI按需引入的操作方法
2020/07/06 Javascript
详解 javascript对象创建模式
2020/10/30 Javascript
element-ui点击查看大图的方法示例
2020/12/14 Javascript
python获取豆瓣电影简介代码分享
2014/01/16 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
在python中按照特定顺序访问字典的方法详解
2018/12/14 Python
django解决跨域请求的问题详解
2019/01/20 Python
Django处理Ajax发送的Get请求代码详解
2019/07/29 Python
外企C语言笔试题
2013/11/10 面试题
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
党员自我评价2015
2015/03/03 职场文书
2015年医德医风工作总结
2015/04/02 职场文书
2019安全宣传标语大全
2019/08/14 职场文书
详解PyTorch模型保存与加载
2022/04/28 Python
MySQL添加索引特点及优化问题
2022/07/23 MySQL
MySQL生成千万测试数据以及遇到的问题
2022/08/05 MySQL