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实现中文数字转换为阿拉伯数字的方法示例
May 26 Python
简单了解Python matplotlib线的属性
Jun 29 Python
Python实现将蓝底照片转化为白底照片功能完整实例
Dec 13 Python
python误差棒图errorbar()函数实例解析
Feb 11 Python
Python实现对adb命令封装
Mar 06 Python
django实现HttpResponse返回json数据为中文
Mar 27 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
Apr 08 Python
浅谈python多线程和多线程变量共享问题介绍
Apr 17 Python
python argparse传入布尔参数false不生效的解决
Apr 20 Python
PyCharm中配置PySide2的图文教程
Jun 18 Python
解决pytorch 交叉熵损失输出为负数的问题
Jul 07 Python
Python实现打乒乓小游戏
Sep 25 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
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
php代码书写习惯优化小结
2013/06/20 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
PHP中echo和print的区别
2014/08/28 PHP
phpstorm配置Xdebug进行调试PHP教程
2014/12/01 PHP
php绘制一条弧线的方法
2015/01/24 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
php app支付宝回调(异步通知)详解
2018/07/25 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
jQuery ajax cache缓存问题
2010/07/01 Javascript
Javascript单元测试框架QUnitjs详细介绍
2014/05/08 Javascript
浅析javascript的return语句
2015/12/15 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
全网小程序接口请求封装实例代码
2020/11/06 Javascript
js实现筛选功能
2020/11/24 Javascript
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
幼儿园家长会欢迎词
2014/01/09 职场文书
高二地理教学反思
2014/01/24 职场文书
公司年会搞笑主持词
2014/03/24 职场文书
2014年十一国庆向国旗敬礼寄语
2014/04/11 职场文书
设备管理实施方案
2014/05/31 职场文书
大学生党员自我剖析材料
2014/10/06 职场文书
行政主管岗位职责
2015/02/03 职场文书
涨价通知
2015/04/23 职场文书
2019优秀干部竞聘演讲稿范文!
2019/07/02 职场文书
文书工作总结(范文)
2019/07/11 职场文书
2019年教师节:送给所有老师的祝福语
2019/09/05 职场文书
导游词之台湾安平古堡
2019/12/25 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang
mysql如何查询连续记录
2022/05/11 MySQL