Python3压缩和解压缩实现代码


Posted in Python onMarch 01, 2021

一、说明

压缩和解压缩是日常常用的操作,不管是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

# Python学习交流群:778463939
# 函数功能是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)

到此这篇关于Python3压缩和解压缩实现代码的文章就介绍到这了,更多相关Python3压缩和解压缩内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
用生成器来改写直接返回列表的函数方法
May 25 Python
Django 导出 Excel 代码的实例详解
Aug 11 Python
TF-IDF算法解析与Python实现方法详解
Nov 16 Python
Python排序搜索基本算法之选择排序实例分析
Dec 09 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
Apr 26 Python
在PyCharm中实现关闭一个死循环程序的方法
Nov 29 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
Jan 02 Python
python3.7通过thrift操作hbase的示例代码
Jan 14 Python
使用Nibabel库对nii格式图像的读写操作
Jul 01 Python
Python 利用argparse模块实现脚本命令行参数解析
Dec 28 Python
python re模块常见用法例举
Mar 01 Python
Python jiaba库的使用详解
Nov 23 Python
python re模块常见用法例举
Mar 01 #Python
Python实现简单的2048小游戏
Mar 01 #Python
Python使用Turtle模块绘制国旗的方法示例
Feb 28 #Python
Python页面加载的等待方式总结
Feb 28 #Python
Python Selenium操作Cookie的实例方法
Feb 28 #Python
Python Selenium异常处理的实例分析
Feb 28 #Python
python常量折叠基础知识点讲解
Feb 28 #Python
You might like
php google或baidu分页代码
2009/11/26 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
2013/07/22 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
基于jquery的超简单上下翻
2010/04/20 Javascript
jQuery EasyUI API 中文文档 - PropertyGrid属性表格
2011/11/18 Javascript
javascript中强制执行toString()具体实现
2013/04/27 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
2017/02/09 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
原生js实现简单的Ripple按钮实例代码
2017/03/24 Javascript
vue 如何添加全局函数或全局变量以及单页面的title设置总结
2017/06/01 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
package.json中homepage属性的作用详解
2020/03/11 Javascript
Angular+Ionic使用queryParams实现跳转页传值的方法
2020/09/05 Javascript
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
[49:15]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第二场 1月19日
2021/03/11 DOTA
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
python服务器端收发请求的实现代码
2014/09/29 Python
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
python版本的仿windows计划任务工具
2018/04/30 Python
在pandas中遍历DataFrame行的实现方法
2019/10/23 Python
师德师风建设整改措施思想汇报
2014/10/11 职场文书
个人廉洁自律总结
2015/03/06 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers