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 相关文章推荐
教大家使用Python SqlAlchemy
Feb 12 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
Jun 14 Python
python 线程的暂停, 恢复, 退出详解及实例
Dec 06 Python
浅谈五大Python Web框架
Mar 20 Python
基于Django的ModelForm组件(详解)
Dec 07 Python
django foreignkey(外键)的实现
Jul 29 Python
tensorflow实现对张量数据的切片操作方式
Jan 19 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
Jan 25 Python
jupyter notebook 添加kernel permission denied的操作
Apr 21 Python
python 中的9个实用技巧,助你提高开发效率
Aug 30 Python
Python Parser的用法
May 12 Python
实例讲解Python中sys.argv[]的用法
Jun 03 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
php之XML转数组函数的详解
2013/06/07 PHP
PHP中使用socket方式GET、POST数据实例
2015/04/02 PHP
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
JavaScript与C# Windows应用程序交互方法
2007/06/29 Javascript
javascript instanceof 内部机制探析
2010/10/15 Javascript
基于jQuery替换table中的内容并显示进度条的代码
2011/08/02 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
Angular JS数据的双向绑定详解及实例
2016/12/31 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
Vue AST源码解析第一篇
2017/07/19 Javascript
nodejs分离html文件里面的js和css的方法
2019/04/09 NodeJs
通过实例了解js函数中参数的传递
2019/06/15 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
[02:16]DOTA2英雄基础教程 干扰者
2014/01/15 DOTA
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
python pandas 对时间序列文件处理的实例
2018/06/22 Python
python实现画一颗树和一片森林
2018/06/25 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
python通过实例讲解反射机制
2019/10/17 Python
django xadmin action兼容自定义model权限教程
2020/03/30 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
2020/07/01 Python
Python内置函数property()如何使用
2020/09/01 Python
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
俄罗斯外国汽车和国产汽车配件网上商店:Движком
2020/04/19 全球购物
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
房屋委托书范本
2014/04/04 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
工伤死亡理赔协议书
2014/10/20 职场文书
北京导游词
2015/02/12 职场文书
小学生安全教育主题班会
2015/08/12 职场文书