解压你的压缩:Python ZipFile 实战指南(一)ZipFile 类和它的参数们

这篇具有很好参考价值的文章主要介绍了解压你的压缩:Python ZipFile 实战指南(一)ZipFile 类和它的参数们。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考

项目 描述
维基百科 ZIP 格式
Python 官方文档 zipfile - 使用ZIP存档
搜索引擎 GoogleBing
Zip 文件格式规范 APPNOTE.TXT

描述

项目 描述
Python 3.10.6
操作系统 Windows 10 专业版(x86-64)

铺垫

Zip 文件

ZIP 文件格式是一种数据压缩和文档储存的文件格式,原名 Deflate,发明者为菲尔·卡茨(Phil Katz),他于1989年1月公布了该格式的资料。ZIP通常使用后缀名 .zip,它的 MIME 格式为 application/zip。目前,ZIP格式属于几种主流的压缩格式之一,其竞争者包括RAR格式以及开放源码的 7z 格式。从性能上比较,RAR 及 7z 格式较 ZIP 格式压缩率较高,而7-Zip由于提供了免费的压缩工具而逐渐在更多的领域得到应用。Microsoft从Windows ME操作系统开始内置对zip格式的支持,即使用户的电脑上没有安装解压缩软件,也能打开和制作zip格式的压缩文件,OS X和流行的Linux操作系统也对zip格式提供了类似的支持。因此如果在网络上传播和分发文件,zi p格式往往是最常用的选择。

ZipFile 模块

zipfile 模块是 Python 标准库 中用于处理 Zip 文件的模块。它提供了一系列的函数和类,可以方便地进行 Zip 文件的创建、读取和解压缩操作。

Zip 文件格式规范

APPNOTE.TXT 是一个关于 Zip 文件格式的官方规范文档,被广泛引用和使用。文档提供了详细的技术细节和规范,包括文件格式结构、文件存储方式、压缩算法、加密方式、注释信息、时间戳等等。
该文档由 PKWARE 公司发布,该公司也是 Zip 格式的发明者和开发者。由于 Zip 文件格式的普及,该规范文档被广泛引用,同时也影响了其他一些压缩文件格式的设计。因此,对于使用 Zip 文件的人来说,了解该规范文档对于正确地操作 Zip 文件是非常重要的。

PKWARE

PKWARE 是一家总部位于美国威斯康星州密尔沃基的软件公司,专门从事数据压缩和数据保护技术。该公司是数据压缩标准 ZIP 格式的创始人之一,还创建了许多其他压缩和加密技术,包括 PKZIP、SecureZIP、Smartcrypt 和 PKWARE Data Security 等产品。PKWARE 的产品被广泛用于数据压缩和加密、数据备份和恢复、数据存储和传输等领域。

ZipFile

ZipFile 类是 zipfile 模块中最重要的类之一,它提供了一系列的方法,用于创建、读取和解压缩 Zip 文件。

zipfile.ZipFile(file, mode="r", compression=ZIP_STORED, allowZip64=True,  compresslevel=None, *, strict_timestamps=True)

file

ZipFile 类的 file 参数用于指定 Zip 文件的名称或路径。该参数的值可以是一个字符串类型的文件路径,也可以是一个文件对象。

file 参数为字符串类型的文件路径

举个栗子

from zipfile import ZipFile


# 指定需要被压缩的文件
FILEPATH = r'C:\Users\RedHeart\PycharmProjects\pythonProject\月亮与六便士.txt'
# 指定被创建的 Zip 文件所处的路径
ZIPPATH = r'C:\Users\RedHeart\PycharmProjects\pythonProject\月亮与六便士.zip'

# 以覆盖模式(若 ZIP 文件尚不存在,则创建它,若
# Zip 文件已经存在,则覆盖它)打开 ZIP 文件
fz = ZipFile(ZIPPATH, mode='w')

# 将目标文件写入 Zip 压缩文件中
# write() 的第一个参数用于指定需要写入 Zip 压缩文件中
# 的文件所处的路径,第二个参数用于指定该文件在 Zip 压缩
# 文件中所处的路径。
fz.write(FILEPATH, arcname='月亮与六便士.txt')

# 输出 Zip 压缩文件中的文件列表
fz.printdir()

# 关闭 Zip 文件
fz.close()

执行效果

File Name                                             Modified             Size
月亮与六便士.txt                                     2023-04-22 16:01:22       315564
file 参数为一个文件对象

ZipFile 与上下文管理器

ZipFile 对象实现了上下文管理器接口,因此可以使用 with 语句来打开和关闭 ZIP 文件。使用上下文管理器可以确保在离开 with 代码块时,文件被自动关闭,避免了因为代码异常而导致文件句柄没有正确释放的问题。

举个栗子

from zipfile import ZipFile


FILEPATH = r'C:\Users\RedHeart\PycharmProjects\pythonProject\月亮与六便士.txt'
ZIPPATH = r'C:\Users\RedHeart\PycharmProjects\pythonProject\月亮与六便士.zip'

# 以二进制可读写模式打开 ZIP 文件,
# 若该文件不存在则创建它;若该文件存在,
# 则覆盖它。
with open(ZIPPATH, 'wb+') as fo:
    with ZipFile(fo, 'w') as fz:
        fz.write(FILEPATH, arcname='月亮与六便士')
        fz.printdir()

执行效果

File Name                                             Modified             Size
月亮与六便士                                         2023-04-22 16:01:22       315564

注:

若使用文件对象作为 ZipFile()file 参数的值,那么你需要保证该文件对象是以二进制模式的方式进行打开的。否则在使用 write() 等方法对 Zip 文件对象进行操作时可能将引发错误。对此,请参考如下示例:

from zipfile import ZipFile


FILEPATH = r'C:\Users\RedHeart\PycharmProjects\pythonProject\月亮与六便士.txt'
ZIPPATH = r'C:\Users\RedHeart\PycharmProjects\pythonProject\月亮与六便士.zip'

# 使用文本模式下的可读写模式打开 Zip 文件
with open(ZIPPATH, 'w+') as fo:
    with ZipFile(fo, 'w') as fz:
        fz.write(FILEPATH, arcname='月亮与六便士')
        fz.printdir()

输出错误信息

TypeError: write() argument must be str, not bytes

mode

ZipFile 类的 mode 参数用于指定 Zip 文件的打开或创建模式,该参数的值可以是 r、w、x 或 a。

  1. r
    mode 参数的 默认值r,表示以只读方式打开 zip 文件。如果文件不存在,则会引发异常 FileNotFoundError

  2. w
    以覆盖方式打开 Zip 文件。若目标 Zip 文件已经存在,则该文件将被覆盖。若目标文件尚不存在,则创建它。

  3. x
    以排它方式进行 Zip 文件的创建。若文件已经存在,则会引发 FileExistsError 异常。

  4. a
    以追加方式打开 Zip 文件。若文件已经存在,则在该文件的末尾进行文件的写入。若目标文件尚不存在,则创建它。

只读模式与读或写的操作

上述模式中,仅当将 Zip 文件的模式指定为 r 时,你才不具有对 Zip 文件进行写的权力。在另外三种模式下,你均可以对 Zip 文件进行读或写的操作。

compression

ZipFile 类的 compression 参数用于指定压缩文件时使用的压缩算法,它可以被设置为以下四个值之一:ZIP_STOREDZIP_DEFLATEDZIP_BZIP2ZIP_LZMA

项目 描述
ZIP_STORED 该值为 copression 参数的 默认值。不进行任何压缩,直接存储原始数据,通常使用该压缩算法对文件进行归档(将多个文件归并为一个文件,便于文件的存储与转移)。
ZIP_DEFLATED 指定使用 Deflate 压缩算法,该算法是 ZIP 文件中最常用的压缩算法之一。Deflate 算法能够提供比较高的压缩率和较快的压缩和解压速度,适用于大多数压缩场景。
ZIP_BZIP2 指定使用 Bzip2 压缩算法。与 Deflate 算法相比,Bzip2算法可以获得更高的压缩率,但压缩和解压速度较慢,适用于需要获得更高压缩率的场景。
ZIP_LZMA 指定使用 LZMA 压缩算法。LZMA 算法可以提供比 Bzip2 更高的压缩率,但压缩和解压速度更慢,并且需要更多的内存。因此,ZIP_LZMA 适用于需要获得极高压缩率并且可以承受较慢的压缩和解压速度的场景。

allowZip64

ZipFile 类的 compression 参数用于指定 Zip 文件在必要情况下是否可以使用 Zip64 格式来支持超过 4GB 的文件。

中央结构目录

中央结构目录

中央目录结构是 ZIP 文件格式的一部分,它存储了 ZIP 文件中包含的所有文件和目录的元数据信息,如文件名、文件属性、文件的压缩前和压缩后的大小等。

Zip 内存储的文件的位置和大小

中央目录结构还需要记录 ZIP 文件内存储的文件的位置和大小,这是因为 ZIP 文件是一种归档文件格式,其中的文件通常都经过了压缩处理,不像普通的文件系统一样,可以直接访问。

因此,当需要解压缩 ZIP 文件中的某个文件时,需要知道该文件的存储位置和大小,以便可以正确地读取和还原该文件。中央目录结构中存储的位置和大小信息可以帮助 ZIP 工具在解压缩和操作 ZIP 文件时快速地定位和处理文件,确保 ZIP 文件的正确性和完整性。

完整性

此外,中央目录结构还可以用于查看 ZIP 文件的内容列表,以及检查 ZIP 文件的完整性和有效性,因为 中央目录结构记录了文件的元数据信息,可以用于验证 ZIP 文件中是否存在任何损坏或缺失的文件

Zip64

在传统的 Zip 文件格式中,每个 Zip 文件内的所有文件和目录都由一个中央目录结构引用,而该结构中存储文件大小和位置的字段只有 4 个字节,使用 2^32-1 个二进制位来记录信息,所能表示的最大容量位 4GB。因此,传统的 Zip 文件格式的限制是单个文件不能超过 4GB。如果需要支持超过 4GB 的文件,则需要使用 Zip64 格式。Zip64 格式使用 8 字节的字段来存储文件大小和位置,可以处理更大的文件和归档文件。

zipfile.LargeZipFile

倘若你尝试在没有使用 Zip64 扩展格式时压缩占用空间超过 4GB 的文件,Python 将抛出如下异常信息并停止压缩文件。

zipfile.LargeZipFile: Filesize would require ZIP64 extensions

compresslevel

compresslevel 形参控制在将文件进行压缩时将使用的压缩等级,压缩等级越高,压缩后文件的体积越小,但压缩和解压缩过程会相应的增加。

注:

  1. 当压缩算法使用的是 ZIP_STOREDZIP_LZMA 时指定压缩等级将不会产生任何变化。

  2. 当使用 ZIP_DEFLATED 作为压缩算法时,压缩等级可在 -1 ~ 9 范围内;当使用 ZIP_BZIP2 作为压缩算法时,压缩等级可在 1 ~ 9 范围内。

  3. 当使用 ZIP_DEFLATED 作为压缩算法时,其默认的压缩等级为 -1,该压缩等级是速度和压缩率之间的平衡 (一般相当于设压缩等级为 6)。

  4. 当使用 ZIP_DEFLATED 作为压缩算法时,若将压缩等级设定为 0,则其产生的效果与 ZIP_STORED 无异。

  5. 当使用 ZIP_BZIP2 作为压缩算法时,其默认的压缩等级为 9

strict_timestamps

strict_timestamps 参数是用于控制是否允许压缩早于 1980 年或晚于 2107 年的文件,并且在压缩这些文件时是否将时间戳设置为最小或最大允许值。
当 strict_timestamps 参数为 False 时,zipfile.ZipFile 类会允许压缩早于 1980 年或晚于 2107 年的文件,并将这些文件的时间戳设为 1980 年 1 月 1 日2107 年 12 月 31 日。对此,请参考如下示例:

import os
from zipfile import ZipFile


# 获取目标文件的访问时间戳
atime = os.path.getatime('月亮与六便士.txt')
# 将目标文件的修改时间戳设置为 1970 年 1 月 1 日 8:00:00
os.utime('月亮与六便士.txt', (atime, 0))

FILEPATH = r'C:\Users\RedHeart\PycharmProjects\pythonProject\月亮与六便士.txt'
ZIPPATH = r'C:\Users\RedHeart\PycharmProjects\pythonProject\月亮与六便士.zip'

# 尝试将早于 1980 年的文件写入 Zip 文件中
with open(ZIPPATH, 'wb+') as fo:
    with ZipFile(ZIPPATH, 'w', strict_timestamps=False) as fz:
        fz.write(FILEPATH, arcname='月亮与六便士.txt')
        fz.printdir()

执行效果

File Name                                             Modified             Size
月亮与六便士.txt                                     1980-01-01 00:00:00       315564

如果您需要在压缩文件时保留原始时间戳,则可以将 strict_timestamps 参数设置为 True(默认值),但这可能会导致无法压缩某些文件。对此,请参考如下示例:

import os
from zipfile import ZipFile


# 获取目标文件的访问时间戳
atime = os.path.getatime('月亮与六便士.txt')
# 将目标文件的修改时间戳设置为 1970 年 1 月 1 日 8:00:00
os.utime('月亮与六便士.txt', (atime, 0))

FILEPATH = r'C:\Users\RedHeart\PycharmProjects\pythonProject\月亮与六便士.txt'
ZIPPATH = r'C:\Users\RedHeart\PycharmProjects\pythonProject\月亮与六便士.zip'

# 尝试将早于 1980 年的文件写入 Zip 文件中
with open(ZIPPATH, 'wb+') as fo:
    with ZipFile(ZIPPATH, 'w') as fz:
        fz.write(FILEPATH, arcname='月亮与六便士.txt')

执行效果

由于在 strict_timestamps=True 时尝试将修改时间早于 1980 年 1 月 1 日 的文件写入 Zip 文件中,Python 抛出了 ValueError 异常错误。

ValueError: ZIP does not support timestamps before 1980

注:

strict_timestamps 针对的时间戳为文件的修改时间戳(文件最后一次修改的时间所对应的时间戳信息),在将文件输入到压缩包中时,写入的也仅仅为文件的修改时间戳(文件的创建时间戳、元数据更改时间戳,访问时间戳等时间戳信息并不会写入 Zip 文件中)。文章来源地址https://www.toymoban.com/news/detail-422325.html

到了这里,关于解压你的压缩:Python ZipFile 实战指南(一)ZipFile 类和它的参数们的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python实现rar、zip和7z文件的压缩和解压

    一、7z压缩文件的压缩和解压 1、安装py7zr 我们要先安装 py7zr 第三方库: 如果python环境有问题,执行上面那一条安装语句老是安装在默认的python环境的话,我们可以执行下面这条语句,将第三方库安装在项目的虚拟环境中: 2、解压7z文件 3、压缩成7z文件 二、rar压缩文件的压

    2024年02月07日
    浏览(55)
  • Linux使用解压命令unzip报错:unzip: cannot find zipfile directory in one of xxx.zip

    在linux服务器下使用rz上传压缩文件,用unzip命令解压zip包 报这种错误说明在文件上传或下载的过程中出现了文件丢失的情况,需要使用 sftp或scp重新上传文件到服务器 ,然后使用unzip命令或jar命令解压压缩文件

    2024年02月16日
    浏览(55)
  • [python]批量解压文件夹下所有压缩包(rar、zip、7z)

            在文件夹作用包含许多压缩包的时候,解压起来就很费时费力,尤其是在文件夹还存在嵌套的情况下,解压起来就更麻烦了。Franpper今天给大家带来递归遍历指定路径下的所有文件和文件夹,批量解压所有压缩包的方法,帮大家一键解压。         常见的压缩包格

    2024年02月09日
    浏览(63)
  • 在Django中使用zipfile模块实现对上传的zip压缩包提取文件名

    目录 方法一:解压zip压缩包 思路一:获取带相对路径的文件名 思路二:只获取文件名(不带路径) 方法二:不解压压缩包(推荐) 思路一:获取带相对路径的文件名 思路二:只获取文件名(不带路径) 中文乱码的处理 方式一:解压压缩包(不带路径) 方式二:解压压缩

    2024年02月13日
    浏览(52)
  • 广告投放实战指南,让你的技术产品走向成功!

    作为深耕智能客服领域多年的云客服厂商,美洽在开拓市场、品牌运营、获线转化等方面积累了一定的经验,并打造出了在线客服、呼叫中心、客服机器人、工单系统、语音机器人等智能客服全域产品矩阵,不仅为企业与客户的沟通提供了便利,更为企业实现“线索-营销-转

    2024年02月05日
    浏览(58)
  • Linux :: 压缩与解压指令【1】:zip / unzip 指令:压缩与解压用法详解

    前言:本篇是 Linux 基本操作篇章的内容! 笔者使用的环境是基于腾讯云服务器:CentOS 7.6 64bit。 学习集: C++ 入门到入土!!!学习合集 Linux 从命令到网络再到内核!学习合集 目录索引: 1. 基本用法及功能 2. 基本用法:压缩/解压指定文件【注意代码示例内容!】 3. 「-r」

    2024年01月25日
    浏览(59)
  • Linux下压缩解压命令

    2.命令:gzip 特点:只能压缩文件,压缩后原文件删除,生成 xxx.gz文件 压缩: 用法:gzip [需压缩文件] 解压: 用法:gunzip [压缩包] 3.命令:bzip2 特点:只能压缩文件,压缩后原文件删除,生成 xxx.bz2 压缩: 用法:bzip2 [需压缩文件] 解压: 用法:bunzip2 [压缩包] 4.命令:tar 特

    2024年02月06日
    浏览(46)
  • 【方法】7Z压缩包如何解压?

    你知道7Z压缩包如何解压吗? 7Z是一种主流高效的压缩格式,它可以用多种压缩解压软件来解压,像7-Zip、WinRAR等常用的解压缩软件都可以解压7Z压缩包。 首先我们可以从官网或者软件商店里免费下载7-Zip或者WinRAR解压缩软件,再安装在电脑里。 安装完成后,用鼠标选中压缩包

    2024年02月13日
    浏览(48)
  • zip解压和压缩

    引言 介绍zip文件的概念 涉及到的Java类和包: java.util.zip https://blog.csdn.net/u012998680/article/details/126060855 压缩文件 准备压缩的源文件和目标zip文件的路径 创建 FileOutputStream 和 ZipOutputStream 对象 创建源文件的 File 和 FileInputStream 对象 创建 ZipEntry 对象,并设置其名称为源文件的名

    2024年02月11日
    浏览(88)
  • Linux 压缩和解压

    1、tar命令(复杂) 使用tar命令均可以进行压缩和解压缩的操作 语法:tar [-c -v -x -f -z -C] 参数1 参数2 ... 参数N -c,创建压缩文件,用于压缩模式 -v,显示压缩、解压过程,用于查看进度 -x,解压模式 -f,要创建的文件,或要解压的文件,-f选项必须在所有选项中位置处于最后

    2024年02月07日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包