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 相关文章推荐
Python的Flask框架中实现登录用户的个人资料和头像的教程
Apr 20 Python
Python实现的密码强度检测器示例
Aug 23 Python
python 画三维图像 曲面图和散点图的示例
Dec 29 Python
python 在指定范围内随机生成不重复的n个数实例
Jan 28 Python
python把1变成01的步骤总结
Feb 27 Python
python使用BeautifulSoup与正则表达式爬取时光网不同地区top100电影并对比
Apr 15 Python
在python中实现调用可执行文件.exe的3种方法
Jul 07 Python
Python的PIL库中getpixel方法的使用
Apr 09 Python
python脚本和网页有何区别
Jul 02 Python
对python中list的五种查找方法说明
Jul 13 Python
pandas数值排序的实现实例
Jul 25 Python
PyTorch device与cuda.device用法
Apr 03 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下载远程文件类(支持断点续传)
2008/11/14 PHP
完美解决PHP中的Cannot modify header information 问题
2013/08/12 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
php curl 模拟登录并获取数据实例详解
2016/12/22 PHP
thinkPHP5.0框架开发规范简介
2017/03/25 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
iframe中子父类窗口调用JS的方法及注意事项
2015/08/25 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
2016/03/18 Javascript
Jquery实现的简单轮播效果【附实例】
2016/04/19 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
2016/06/15 Javascript
jQuery插件autocomplete使用详解
2017/02/04 Javascript
微信小程序列表渲染功能之列表下拉刷新及上拉加载的实现方法分析
2017/11/27 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
使用 Element UI Table 的 slot-scope方法
2019/10/10 Javascript
element中Steps步骤条和Tabs标签页关联的解决
2020/12/08 Javascript
[58:12]Ti4第二日主赛事败者组 LGD vs iG 3
2014/07/21 DOTA
详解TensorFlow在windows上安装与简单示例
2018/03/05 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
2020/06/09 Python
如何使用 Flask 做一个评论系统
2020/11/27 Python
深入解析HTML5的IndexedDB索引数据库
2015/09/14 HTML / CSS
大学生学习生活的自我评价
2013/11/01 职场文书
大学生创业事迹材料
2014/12/30 职场文书
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript
python如何将mat文件转为png
2022/07/15 Python