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在linux中输出带颜色的文字的方法
Jun 19 Python
Python日期的加减等操作的示例
Aug 15 Python
基于Python __dict__与dir()的区别详解
Oct 30 Python
Python时间戳使用和相互转换详解
Dec 11 Python
详解python Todo清单实战
Nov 01 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
Jan 19 Python
详解pandas数据合并与重塑(pd.concat篇)
Jul 09 Python
pycharm创建scrapy项目教程及遇到的坑解析
Aug 15 Python
python实现输出一个序列的所有子序列示例
Nov 18 Python
Python面向对象之多态原理与用法案例分析
Dec 30 Python
Python爬虫之Selenium多窗口切换的实现
Dec 04 Python
Python实现视频自动打码的示例代码
Apr 08 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
这部番真是良心,画质好到像风景区,剧情让人跟着小公会热血沸腾
2020/03/10 日漫
消息持续发送的完整例子
2006/10/09 PHP
PHP 面向对象 final类与final方法
2010/05/05 PHP
处理(php-cgi.exe - FastCGI 进程超过了配置的请求超时时限)的问题
2013/07/03 PHP
php读取本地文件常用函数(fopen与file_get_contents)
2013/09/09 PHP
php mysql_real_escape_string函数用法与实例教程
2013/09/30 PHP
php数组排序usort、uksort与sort函数用法
2014/11/17 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
php curl批处理实现可控并发异步操作示例
2018/05/09 PHP
a标签的css样式四个状态
2021/03/09 HTML / CSS
dojo 之基础篇(三)之向服务器发送数据
2007/03/24 Javascript
javascript 打印页面代码
2009/03/24 Javascript
JQquery的一些使用心得分享
2012/08/01 Javascript
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
js css 实现遮罩层覆盖其他页面元素附图
2014/09/22 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
jQuery获取单击节点对象的方法
2016/06/02 Javascript
vue+elementui 对话框取消 表单验证重置示例
2019/10/29 Javascript
Python 执行字符串表达式函数(eval exec execfile)
2014/08/11 Python
Python发送Email方法实例
2014/08/21 Python
python实现的文件夹清理程序分享
2014/11/22 Python
详解python中xlrd包的安装与处理Excel表格
2016/12/16 Python
详解python并发获取snmp信息及性能测试
2017/03/27 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
python3多线程知识点总结
2019/09/26 Python
用python求一重积分和二重积分的例子
2019/12/06 Python
python——全排列数的生成方式
2020/02/26 Python
使用JS+CSS3技术:让你的名字动起来
2013/04/27 HTML / CSS
美国美发品牌:Bumble and Bumble
2016/10/08 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
群众路线教育实践活动整改落实情况汇报
2014/10/28 职场文书
班主任经验交流材料
2014/12/16 职场文书
简历自我评价:教师师德表现自我评价
2019/04/24 职场文书
Python3中PyQt5简单实现文件打开及保存
2021/06/10 Python