• 详解Python压缩包处理模块zipfile和py7zr


            目前对文件的压缩和解压缩比较常用的格式就是zip格式和7z格式,今天就以一篇文章来融会贯通会该两个压缩文件格式的操作。

    一:zipfile的常用操作

    1,压缩文件

     zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])

             参数file表示文件的路径;参数mode指示打开zip文件的模式,有三种mode

    • 解压:r
    • 压缩:w
    • 追加压缩:a 

            默认值为'r',表示读已经存在的zip文件,也可以为'w'或'a','w'表示新建一个zip文档或覆盖一个已经存在的zip文档,‘a’表示追加压缩

            下面我们创建一个压缩文件result.zip,并压缩test文件夹下的所有文件

    1. import zipfile
    2. import os
    3. testdir = "D:\\FTZ\\python_tool\\result\\test"
    4. filename = "./result.zip"
    5. z = zipfile.ZipFile(filename, 'w')
    6. for d in os.listdir(testdir):
    7. z.write(d)
    8. z.close

    当然上面还可以用with的方法打开

    1. import zipfile
    2. import os
    3. testdir = "D:\\DPI\\python_tool\\result\\test"
    4. filename = "./result.zip"
    5. with zipfile.ZipFile(filename, 'w') as z:
    6. for d in os.listdir(testdir):
    7. z.write(d)
    8. z.close

    2,解压缩文件

    1. import zipfile
    2. import os
    3. testdir = "D:\\FTZ\\python_tool\\result\\test"
    4. filename = "./result.zip"
    5. with zipfile.ZipFile(filename, 'r') as z:
    6. z.extractall(testdir)

    需要注意的是有些压缩包解压是有密码,这时候调用extractall的时候也支持输入密码,在python3中,解压文件的密码参数 pwd 接收的是二进制的值,所以要在前面加一个 b

    z.extractall(testdir,pwd=b"ftz")

    3,列出压缩包里的所有文件

    1. import zipfile
    2. import os
    3. testdir = "D:\\DPI\\python_tool\\result\\test"
    4. filename = "./result.zip"
    5. with zipfile.ZipFile(filename, 'r') as z:
    6. files = z.namelist()
    7. print(files)

    运行结果如下,返回的是一个列表:

     4,其他常用的方法

    1. import zipfile
    2. import os
    3. testdir = "D:\\ftz\\python_tool\\result\\test"
    4. filename = "./result.zip"
    5. with zipfile.ZipFile(filename, 'r') as z:
    6. z.setpassword(b'ftz1') #设置zip文档的密码。
    7. z.printdir() #将zip文档内的信息打印到控制台上。
    8. data = z.read('file.yaml') #获取zip文档内指定文件的二进制数据
    9. print(data)
    10. info = z.getinfo('file.yaml') #方法返回的是一个ZipInfo对象,表示zip文档中相应文件的信息。它支持如下属性
    11. print("获取文件名称:",info.filename)
    12. print("获取文件最后修改时间:",info.date_time)
    13. print("获取压缩类型:",info.compress_type)
    14. print("获取压缩后的大小:",info.compress_size)
    15. print("获取未压缩的文件大小:",info.file_size)
    16. print("判断是否是压缩文件:",zipfile.is_zipfile(filename))

    运行结果如下:

    1. File Name Modified Size
    2. data_yaml.yaml 2022-06-25 10:50:42 198
    3. file.yaml 2022-06-25 10:13:46 123
    4. vnfname.txt 2022-01-14 11:27:56 9320
    5. b'\xe4\xb8\x80\xe7\xba\xa7\xe6\xa0\x87\xe9\xa2\x98:\n \xe4\xba\x8c\xe7\xba\xa7\xe6\xa0\x87\xe9\xa2\x981:\n b:1\n c:2\n a:3\n \xe4\xba\x8c\xe7\xba\xa7\xe6\xa0\x87\xe9\xa2\x982:\n f:7\n t:8\n z:9'
    6. 获取文件名称: file.yaml
    7. 获取文件最后修改时间: (2022, 6, 25, 10, 13, 46)
    8. 获取压缩类型: 0
    9. 获取压缩后的大小: 123
    10. 获取未压缩的文件大小: 123
    11. 判断是否是压缩文件: True
    12. [Finished in 0.2s]

    当然getinfo也支持其他的属性,下面给出比较全的属性和方法

    ZipInfo.filename: 获取文件名称。

    ZipInfo.date_time: 获取文件最后修改时间。返回一个包含6个元素的元组:(年, 月, 日, 时, 分, 秒)

    ZipInfo.compress_type: 压缩类型。

    ZipInfo.comment: 文档说明。

    ZipInfo.extr: 扩展项数据。

    ZipInfo.create_system: 获取创建该zip文档的系统。

    ZipInfo.create_version: 获取 创建zip文档的PKZIP版本。

    ZipInfo.extract_version: 获取 解压zip文档所需的PKZIP版本。

    ZipInfo.reserved: 预留字段,当前实现总是返回0。

    ZipInfo.flag_bits: zip标志位。

    ZipInfo.volume: 文件头的卷标。

    ZipInfo.internal_attr: 内部属性。

    ZipInfo.external_attr: 外部属性。

    ZipInfo.header_offset: 文件头偏移位。

    ZipInfo.CRC: 未压缩文件的CRC-32。

    ZipInfo.compress_size: 获取压缩后的大小。

    ZipInfo.file_size: 获取未压缩的文件大小。

     二:py7zr的常用操作

     1,压缩文件

    1. import py7zr
    2. with py7zr.SevenZipFile('target.7z', 'w') as archive:
    3. archive.writeall('/path/to/base_dir', 'base')

    如果想设置密码压缩

    1. import py7zr
    2. with py7zr.SevenZipFile('target.7z', 'w', password='secret') as archive:
    3. archive.writeall('/path/to/base_dir', 'base')

    2,解压缩文件

    1. import py7zr
    2. archive = py7zr.SevenZipFile('sample.7z', mode='r')
    3. archive.extractall(path="/tmp")
    4. archive.close()

    也支持with模式

    1. import py7zr
    2. with py7zr.SevenZipFile('sample.7z', mode='r') as z:
    3. z.extractall()
    4. with py7zr.SevenZipFile('target.7z', 'w') as z:
    5. z.writeall('./base_dir')

    py7z也支持提取某个文件或者符合正则匹配的文件

    1. import py7zr
    2. import re
    3. filter_pattern = re.compile(r'<your/target/file_and_directories/regex/expression>')
    4. with SevenZipFile('archive.7z', 'r') as archive:
    5. allfiles = archive.getnames()
    6. selective_files = [f for f in allfiles if filter_pattern.match(f)]
    7. archive.extract(targets=selective_files)

    支持解压缩加密的7z文件

    1. import py7zr
    2. with py7zr.SevenZipFile('encrypted.7z', mode='r', password='secret') as z:
    3. z.extractall()
  • 相关阅读:
    VSC/SMC(十六)——自适应鲁棒滑模控制
    使用QT制作QQ登录界面
    Linux学习第42天:Linux RS232/485/GPS 驱动实验:天外来客
    文件包含漏洞
    CMake 坑之添加文件后不修改CMakeList.txt,则文件加不进来
    MySQL之MHA高可用集群
    【JavaEE】博客系统【前后端分离版本】
    java计算机毕业设计快滴预约平台源码+系统+mysql数据库+lw文档+部署
    脱离微信运行环境,小程序如何实现微信授权登录
    生产环境重大bug,update加上索引字段会走索引进行更新?还是走全表扫描
  • 原文地址:https://blog.csdn.net/qq_27071221/article/details/125462228