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 相关文章推荐
PHP webshell检查工具 python实现代码
Sep 15 Python
Python3基础之函数用法
Aug 13 Python
Python下载网络文本数据到本地内存的四种实现方法示例
Feb 05 Python
matplotlib 输出保存指定尺寸的图片方法
May 24 Python
Python系统监控模块psutil功能与经典用法分析
May 24 Python
浅析python继承与多重继承
Sep 13 Python
python画柱状图--不同颜色并显示数值的方法
Dec 13 Python
Python Tkinter 简单登录界面的实现
Jun 14 Python
利用Python实现手机短信监控通知的方法
Jul 22 Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 Python
Python跑循环时内存泄露的解决方法
Jan 13 Python
Python学习之os包使用教程详解
Mar 21 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
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
javascript XML数据显示为HTML一例
2008/12/23 Javascript
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
使用js简单实现了tree树菜单
2013/11/20 Javascript
javascript学习笔记(三)BOM和DOM详解
2014/09/30 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
jQuery替换textarea中换行的方法
2015/06/10 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
2016/03/08 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)
2017/07/11 Javascript
js通过Date对象实现倒计时动画效果
2017/10/27 Javascript
Vue源码学习之初始化模块init.js解析
2017/11/02 Javascript
jQuery实现的鼠标拖动浮层功能示例【拖动div等任何标签】
2018/12/29 jQuery
微信小程序 数据缓存实现方法详解
2019/08/26 Javascript
微信公众号开发之微信支付代码记录的实现
2019/10/16 Javascript
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
详解Python中的路径问题
2020/09/02 Python
Python+Opencv实现把图片、视频互转的示例
2020/12/17 Python
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
世界上最大的网络主机公司:1&1
2016/10/12 全球购物
优秀小学生家长评语
2014/01/30 职场文书
运动会入场词200字
2014/02/15 职场文书
计算机毕业生自荐信范文
2014/03/23 职场文书
法定代表人授权委托书
2014/04/04 职场文书
高中教师个人工作总结
2015/02/10 职场文书
2016高考寄语或鼓励的话语
2015/12/04 职场文书
积极心理学课程心得体会
2016/01/22 职场文书
Mysql 如何实现多张无关联表查询数据并分页
2021/06/05 MySQL
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android