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入门教程
Apr 03 Python
浅谈Python实现2种文件复制的方法
Jan 19 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
Nov 06 Python
对python制作自己的数据集实例讲解
Dec 12 Python
Python实现的拉格朗日插值法示例
Jan 08 Python
Python修改文件往指定行插入内容的实例
Jan 30 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
Aug 09 Python
python使用if语句实现一个猜拳游戏详解
Aug 27 Python
python3 配置logging日志类的操作
Apr 08 Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
Jan 05 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
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
2011/08/22 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
Codeigniter出现错误提示Error with CACHE directory的解决方案
2014/06/12 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
PHP实现无限分类的实现方法
2016/11/14 PHP
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
node.js中的console.error方法使用说明
2014/12/10 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
javascript实现拖动元素交换位置
2015/11/29 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
angularjs的select使用及默认选中设置
2017/04/08 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
[07:09]2014DOTA2国际邀请赛-Newbee再次发威成功晋级决赛
2014/07/19 DOTA
Eclipse + Python 的安装与配置流程
2013/03/05 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
python 解压pkl文件的方法
2018/10/25 Python
Python小游戏之300行代码实现俄罗斯方块
2019/01/04 Python
使用Python实现将list中的每一项的首字母大写
2019/06/11 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
pytorch 预训练层的使用方法
2019/08/20 Python
django 实现简单的插入视频
2020/04/07 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
小学生自我评价范例
2013/09/24 职场文书
学生党员的自我评价范文
2014/03/01 职场文书
会计个人实习计划书
2014/08/15 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
电气工程师岗位职责
2015/02/12 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技