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中的ConfigParser模块使用详解
May 04 Python
Django框架中处理URLconf中特定的URL的方法
Jul 20 Python
python中的格式化输出用法总结
Jul 28 Python
Python基于OpenCV实现视频的人脸检测
Jan 23 Python
Python实现的FTP通信客户端与服务器端功能示例
Mar 28 Python
对Python闭包与延迟绑定的方法详解
Jan 07 Python
python绘图模块matplotlib示例详解
Jul 26 Python
Python企业编码生成系统之系统主要函数设计详解
Jul 26 Python
Python 、Pycharm、Anaconda三者的区别与联系、安装过程及注意事项
Oct 11 Python
python 实现多线程下载视频的代码
Nov 15 Python
keras中的History对象用法
Jun 19 Python
浅析Python实现DFA算法
Jun 26 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中获取文件扩展名的N种方法小结
2012/02/27 PHP
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
详解phpstorm2020最新破解方法
2020/09/17 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
纯js实现的论坛常用的运行代码的效果
2008/07/15 Javascript
为指定元素增加样式的js代码
2009/12/09 Javascript
javascript实现标签切换代码示例
2016/05/22 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
ES6入门教程之Class和Module详解
2017/05/17 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
JavaScript代码执行的先后顺序问题
2017/10/29 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
electron中使用bootstrap的示例代码
2018/11/06 Javascript
js取小数点后两位四种方法
2019/01/18 Javascript
ionic2.0双击返回键退出应用
2019/09/17 Javascript
[01:29:46]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第二局
2016/02/27 DOTA
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Flask框架中密码的加盐哈希加密和验证功能的用法详解
2016/06/07 Python
Python如何为图片添加水印
2016/11/25 Python
Python 调用Java实例详解
2017/06/02 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
python对excel文档去重及求和的实例
2018/04/18 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
Python常用模块logging——日志输出功能(示例代码)
2019/11/20 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
2020/03/16 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
2014年文艺部工作总结
2014/11/17 职场文书
小学优秀班主任材料
2014/12/17 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
党员身份证明材料
2015/06/19 职场文书
2016年春节问候语
2015/11/11 职场文书
小学英语听课心得体会
2016/01/14 职场文书