zipfile
— 处理 ZIP 压缩文档¶
源代码: Lib/zipfile/
ZIP 文件格式是一种常见的存档和压缩标准。该模块提供了创建、读取、写入、追加和列出 ZIP 文件的工具。任何对该模块的高级使用都需要了解该格式,如 PKZIP 应用说明 中所定义。
此模块目前不处理多磁盘 ZIP 文件。它可以处理使用 ZIP64 扩展的 ZIP 文件(即大小超过 4 GiB 的 ZIP 文件)。它支持解密 ZIP 压缩文档中的加密文件,但目前无法创建加密文件。解密速度非常慢,因为它是在原生 Python 而不是 C 中实现的。
该模块定义了以下项目
- exception zipfile.BadZipFile¶
针对错误的 ZIP 文件引发的错误。
3.2 版本新增。
- exception zipfile.BadZipfile¶
BadZipFile
的别名,用于与旧版本的 Python 兼容。3.2 版本开始弃用。
- exception zipfile.LargeZipFile¶
当 ZIP 文件需要 ZIP64 功能但该功能未启用时引发的错误。
- class zipfile.ZipFile
用于读取和写入 ZIP 文件的类。有关构造函数的详细信息,请参阅 ZipFile 对象 部分。
- class zipfile.Path
实现
pathlib.Path
提供的接口子集的类,包括完整的importlib.resources.abc.Traversable
接口。3.8 版本新增。
- class zipfile.PyZipFile
用于创建包含 Python 库的 ZIP 压缩文档的类。
- class zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))¶
用于表示有关压缩文档成员信息的类。此类的实例由
getinfo()
和infolist()
方法返回ZipFile
对象。大多数zipfile
模块的用户不需要创建这些对象,而只需使用此模块创建的对象。filename 应该是压缩文档成员的完整名称,date_time 应该是一个包含六个字段的元组,用于描述文件上次修改的时间;这些字段在 ZipInfo 对象 部分中进行了描述。在 3.13 版本中更改: 添加了一个公共
compress_level
属性来公开以前受保护的_compresslevel
。为了向后兼容,较旧的受保护名称继续作为属性工作。
- zipfile.is_zipfile(filename)¶
如果 filename 基于其魔数是有效的 ZIP 文件,则返回
True
,否则返回False
。filename 也可以是文件或类文件对象。在 3.1 版本中更改: 支持文件和类文件对象。
- zipfile.ZIP_STORED¶
未压缩的存档成员的数字常量。
- zipfile.ZIP_LZMA¶
LZMA 压缩方法的数字常量。这需要
lzma
模块。3.3 版本新增。
注解
自 2001 年以来,ZIP 文件格式规范已包含对 bzip2 压缩的支持,自 2006 年以来已包含对 LZMA 压缩的支持。但是,某些工具(包括较旧的 Python 版本)不支持这些压缩方法,可能会拒绝处理整个 ZIP 文件,或者无法提取单个文件。
另请参阅
- PKZIP 应用说明
关于 ZIP 文件格式的文档,由该格式和所用算法的创建者 Phil Katz 编写。
- Info-ZIP 主页
有关 Info-ZIP 项目的 ZIP 存档程序和开发库的信息。
ZipFile 对象¶
- class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True, metadata_encoding=None)¶
打开一个 ZIP 文件,其中 file 可以是文件路径(字符串)、类文件对象或 路径类对象。
mode 参数应该是
'r'
以读取现有文件,'w'
以截断并写入新文件,'a'
以追加到现有文件,或'x'
以独占创建并写入新文件。 如果 mode 是'x'
并且 file 指向一个现有文件,则会引发FileExistsError
。 如果 mode 是'a'
并且 file 指向一个现有的 ZIP 文件,则会将其他文件添加到其中。如果 file 没有指向 ZIP 文件,则会将一个新的 ZIP 存档追加到该文件。这旨在将 ZIP 存档添加到另一个文件(例如python.exe
)。如果 mode 是'a'
且文件根本不存在,则会创建该文件。如果 mode 是'r'
或'a'
,则该文件应该是可查找的。compression 是写入存档时要使用的 ZIP 压缩方法,应该是
ZIP_STORED
、ZIP_DEFLATED
、ZIP_BZIP2
或ZIP_LZMA
;无法识别的值将导致引发NotImplementedError
。 如果指定了ZIP_DEFLATED
、ZIP_BZIP2
或ZIP_LZMA
,但相应的模块(zlib
、bz2
或lzma
)不可用,则会引发RuntimeError
。 默认值为ZIP_STORED
。如果 allowZip64 为
True
(默认值),则当 zip 文件大于 4 GiB 时,zipfile 将创建使用 ZIP64 扩展名的 ZIP 文件。如果为false
,则当 ZIP 文件需要 ZIP64 扩展名时,zipfile
将引发异常。compresslevel 参数控制将文件写入存档时使用的压缩级别。当使用
ZIP_STORED
或ZIP_LZMA
时,它不起作用。当使用ZIP_DEFLATED
时,接受整数0
到9
(有关详细信息,请参见zlib
)。当使用ZIP_BZIP2
时,接受整数1
到9
(有关详细信息,请参见bz2
)。当 strict_timestamps 参数设置为
False
时,允许压缩早于 1980-01-01 的文件,但代价是将时间戳设置为 1980-01-01。 对于晚于 2107-12-31 的文件,也会出现类似的行为,时间戳也会设置为该限制值。当模式为
'r'
时,可以将 metadata_encoding 设置为编解码器的名称,该名称将用于解码成员名称和 ZIP 注释等元数据。如果文件是以模式
'w'
、'x'
或'a'
创建,然后在未向存档添加任何文件的情况下closed
,则会将空存档的相应 ZIP 结构写入该文件。ZipFile 也是一个上下文管理器,因此支持
with
语句。在示例中,myzip 在with
语句的套件完成后关闭,即使发生异常也是如此with ZipFile('spam.zip', 'w') as myzip: myzip.write('eggs.txt')
注解
metadata_encoding 是 ZipFile 的实例级设置。目前无法在每个成员的基础上进行设置。
此属性是为那些使用当前区域设置编码或代码页(主要在 Windows 上)生成具有名称的存档的旧版实现提供的解决方法。根据 .ZIP 标准,元数据的编码可以通过存档标头中的标志指定为 IBM 代码页(默认)或 UTF-8。该标志优先于 metadata_encoding,后者是 Python 特有的扩展。
在 3.2 版本中更改: 增加了将
ZipFile
用作上下文管理器的功能。在 3.4 版本中更改: 默认启用 ZIP64 扩展。
在 3.5 版本中更改: 增加了对写入不可查找的流的支持。增加了对
'x'
模式的支持。在 3.6 版本中更改: 以前,对于无法识别的压缩值,会引发一个简单的
RuntimeError
。在 3.6.2 版本中更改: file 参数接受 路径类对象。
在 3.7 版本中更改: 添加了 compresslevel 参数。
在 3.8 版本中更改: strict_timestamps 仅关键字参数。
在 3.11 版本中更改: 增加了对指定 zip 文件目录和文件头中读取元数据的成员名称编码的支持。
- ZipFile.namelist()¶
按名称返回归档文件成员的列表。
- ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False)¶
将归档文件的成员作为类似二进制文件的对象访问。name 可以是归档文件中的文件名或
ZipInfo
对象。如果包含 mode 参数,则必须是'r'
(默认)或'w'
。pwd 是用于解密加密 ZIP 文件的密码,类型为bytes
对象。open()
也是一个上下文管理器,因此支持with
语句。with ZipFile('spam.zip') as myzip: with myzip.open('eggs.txt') as myfile: print(myfile.read())
当 mode 为
'r'
时,类似文件的对象 (ZipExtFile
) 是只读的,并提供以下方法:read()
、readline()
、readlines()
、seek()
、tell()
、__iter__()
、__next__()
。这些对象可以独立于 ZipFile 运行。当
mode='w'
时,将返回一个可写的文件句柄,该句柄支持write()
方法。当可写文件句柄打开时,尝试读取或写入 ZIP 文件中的其他文件将引发ValueError
。在这两种情况下,类似文件的对象还具有属性
name
,它等效于归档文件中的文件名;以及属性mode
,它取决于输入模式,为'rb'
或'wb'
。写入文件时,如果文件大小事先未知,但可能超过 2 GiB,请传递
force_zip64=True
以确保标头格式能够支持大文件。如果事先知道文件大小,请构造一个设置了file_size
的ZipInfo
对象,并将其用作 name 参数。在 3.6 版本中更改: 删除了对
mode='U'
的支持。对于以 通用换行符 模式读取压缩文本文件,请使用io.TextIOWrapper
。在 3.6 版本中更改:
ZipFile.open()
现在可以使用mode='w'
选项将文件写入归档文件。在 3.6 版本中更改: 在已关闭的 ZipFile 上调用
open()
将引发ValueError
。以前,会引发RuntimeError
。在 3.13 版本中更改: 为可写类文件对象添加了属性
name
和mode
。可读类文件对象的mode
属性的值从'r'
更改为'rb'
。
- ZipFile.extract(member, path=None, pwd=None)¶
从归档文件中提取一个成员到当前工作目录;member 必须是其完整名称或一个
ZipInfo
对象。其文件信息将尽可能准确地提取。path 指定要提取到的其他目录。member 可以是文件名或ZipInfo
对象。pwd 是用于加密文件的密码,类型为bytes
对象。返回创建的规范化路径(目录或新文件)。
注解
如果成员文件名是绝对路径,则会剥离驱动器/UNC 共享点和前导(反)斜杠,例如:
///foo/bar
在 Unix 上变为foo/bar
,C:\foo\bar
在 Windows 上变为foo\bar
。并且成员文件名中的所有".."
组件都将被删除,例如:../../foo../../ba..r
变为foo../ba..r
。在 Windows 上,非法字符 (:
、<
、>
、|
、"
、?
和*
) 将被下划线 (_
) 替换。在 3.6 版本中更改: 在已关闭的 ZipFile 上调用
extract()
将引发ValueError
。以前,会引发RuntimeError
。在 3.6.2 版本中更改: path 参数接受一个 类路径对象。
- ZipFile.extractall(path=None, members=None, pwd=None)¶
从归档文件中提取所有成员到当前工作目录。path 指定要提取到的其他目录。members 是可选的,必须是
namelist()
返回的列表的子集。pwd 是用于加密文件的密码,类型为bytes
对象。警告
切勿在未事先检查的情况下从不受信任的来源提取归档文件。可能会在path之外创建文件,例如,成员具有以
"/"
开头的绝对文件名或带有两个点".."
的文件名。此模块尝试防止这种情况发生。请参阅extract()
注释。在 3.6 版本中更改: 在已关闭的 ZipFile 上调用
extractall()
将引发ValueError
。以前,会引发RuntimeError
。在 3.6.2 版本中更改: path 参数接受一个 类路径对象。
- ZipFile.printdir()¶
将归档文件的目录表打印到
sys.stdout
。
- ZipFile.read(name, pwd=None)¶
返回归档文件中文件 name 的字节。name 是归档文件中文件的名称,或一个
ZipInfo
对象。归档文件必须以读取或追加模式打开。pwd 是用于加密文件的密码,以bytes
对象的形式给出,如果指定,它会覆盖使用setpassword()
设置的默认密码。对使用除ZIP_STORED
、ZIP_DEFLATED
、ZIP_BZIP2
或ZIP_LZMA
之外的压缩方法的 ZipFile 调用read()
将引发NotImplementedError
。如果相应的压缩模块不可用,也会引发错误。在 3.6 版本中更改: 对已关闭的 ZipFile 调用
read()
将引发ValueError
。以前,会引发RuntimeError
。
- ZipFile.testzip()¶
读取归档文件中的所有文件,并检查它们的 CRC 和文件头。返回第一个错误文件的名称,否则返回
None
。在 3.6 版本中更改: 对已关闭的 ZipFile 调用
testzip()
将引发ValueError
。以前,会引发RuntimeError
。
- ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None)¶
将名为 filename 的文件写入归档文件,并为其指定归档名称 arcname (默认情况下,这将与 filename 相同,但没有驱动器号并删除前导路径分隔符)。如果给定,compress_type 将覆盖为新条目的构造函数提供的 compression 参数值。类似地,如果给定,compresslevel 将覆盖构造函数。归档文件必须以
'w'
、'x'
或'a'
模式打开。注解
ZIP 文件标准在历史上没有指定元数据编码,但强烈建议使用 CP437(最初的 IBM PC 编码)来实现互操作性。最新版本允许使用 UTF-8(仅限)。在此模块中,如果成员名称包含任何非 ASCII 字符,将自动使用 UTF-8 来写入成员名称。无法使用 ASCII 或 UTF-8 以外的任何编码写入成员名称。
注解
归档名称应相对于归档根目录,也就是说,它们不应以路径分隔符开头。
注解
如果
arcname
(或filename
,如果未给出arcname
) 包含空字节,则归档文件中文件的名称将在空字节处被截断。注解
文件名中的前导斜杠可能会导致在 Windows 系统上的某些 zip 程序中无法打开归档文件。
在 3.6 版本中更改: 对以
'r'
模式创建的 ZipFile 或已关闭的 ZipFile 调用write()
将引发ValueError
。以前,会引发RuntimeError
。
- ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)¶
将文件写入归档文件。内容是 data,它可以是一个
str
或bytes
实例;如果它是一个str
,它会首先被编码为 UTF-8。zinfo_or_arcname 是它在归档文件中将被给定的文件名,或一个ZipInfo
实例。如果它是一个实例,则至少必须给出文件名、日期和时间。如果它是一个名称,则日期和时间将设置为当前日期和时间。归档文件必须以'w'
、'x'
或'a'
模式打开。如果给定,compress_type 将覆盖为新条目的构造函数或在 zinfo_or_arcname 中给出的 compression 参数值(如果后者是一个
ZipInfo
实例)。类似地,如果给定,compresslevel 将覆盖构造函数。注解
当传递
ZipInfo
实例作为 zinfo_or_arcname 参数时,所使用的压缩方法将是给定ZipInfo
实例的 compress_type 成员中指定的方法。默认情况下,ZipInfo
构造函数会将此成员设置为ZIP_STORED
。在 3.2 版本中变更: compress_type 参数。
在 3.6 版本中变更: 在以模式
'r'
创建的 ZipFile 或已关闭的 ZipFile 上调用writestr()
将引发ValueError
。 之前,会引发RuntimeError
。
- ZipFile.mkdir(zinfo_or_directory, mode=511)¶
在压缩文件中创建一个目录。如果 zinfo_or_directory 是一个字符串,则会在压缩文件中创建一个目录,其模式由 mode 参数指定。但是,如果 zinfo_or_directory 是一个
ZipInfo
实例,则会忽略 mode 参数。压缩文件必须以模式
'w'
、'x'
或'a'
打开。在 3.11 版本中加入。
以下数据属性也可用
- ZipFile.filename¶
ZIP 文件的名称。
- ZipFile.debug¶
要使用的调试输出级别。 这可以从
0
(默认值,无输出) 设置为3
(最大输出)。 调试信息会写入到sys.stdout
。
Path 对象¶
- class zipfile.Path(root, at='')¶
从
root
zip 文件构造一个 Path 对象 (该 zip 文件可以是ZipFile
实例,也可以是适合传递给ZipFile
构造函数的file
)。at
指定此 Path 在 zip 文件中的位置,例如 ‘dir/file.txt’、‘dir/’ 或 ''。 默认为空字符串,表示根目录。
Path 对象公开 pathlib.Path
对象的以下功能
可以使用 /
运算符或 joinpath
遍历 Path 对象。
- Path.name¶
最终路径组件。
- Path.open(mode='r', *, pwd, **)¶
在当前路径上调用
ZipFile.open()
。 允许通过支持的模式:‘r’、‘w’、‘rb’、‘wb’ 以读取或写入、文本或二进制方式打开。 位置和关键字参数将传递给io.TextIOWrapper
(当以文本方式打开时),否则将被忽略。pwd
是ZipFile.open()
的pwd
参数。在 3.9 版本中变更: 添加了对 open 的文本和二进制模式的支持。 默认模式现在是文本。
在 3.11.2 版本中变更:
encoding
参数可以作为位置参数提供,而不会导致TypeError
。 就像在 3.9 中一样。 需要与未修补的 3.10 和 3.11 版本兼容的代码必须将所有io.TextIOWrapper
参数(包括encoding
)作为关键字传递。
- Path.iterdir()¶
枚举当前目录的子项。
- Path.is_dir()¶
如果当前上下文引用目录,则返回
True
。
- Path.is_file()¶
如果当前上下文引用文件,则返回
True
。
- Path.is_symlink()¶
如果当前上下文引用符号链接,则返回
True
。在 3.12 版本中加入。
在 3.13 版本中变更: 之前,
is_symlink
会无条件返回False
。
- Path.exists()¶
如果当前上下文引用 zip 文件中的文件或目录,则返回
True
。
- Path.suffix¶
最后一个组件中最后一个以点分隔的部分(如果有)。 这通常称为文件扩展名。
在 3.11 版本中加入: 添加了
Path.suffix
属性。
- Path.suffixes¶
路径的后缀列表,通常称为文件扩展名。
在 3.11 版本中加入: 添加了
Path.suffixes
属性。
- Path.read_text(*, **)¶
将当前文件读取为 Unicode 文本。 位置和关键字参数将传递给
io.TextIOWrapper
(除了buffer
,它由上下文暗示)。在 3.11.2 版本中变更:
encoding
参数可以作为位置参数提供,而不会导致TypeError
。 就像在 3.9 中一样。 需要与未修补的 3.10 和 3.11 版本兼容的代码必须将所有io.TextIOWrapper
参数(包括encoding
)作为关键字传递。
- Path.read_bytes()¶
以字节形式读取当前文件。
- Path.joinpath(*other)¶
返回一个新的 Path 对象,其中每个 other 参数都被连接起来。以下是等效的:
>>> Path(...).joinpath('child').joinpath('grandchild') >>> Path(...).joinpath('child', 'grandchild') >>> Path(...) / 'child' / 'grandchild'
在 3.10 版本中变更: 在 3.10 之前,
joinpath
是未记录的,并且只接受一个参数。
zipp 项目为较旧的 Python 版本提供了最新路径对象功能的向后移植。使用 zipp.Path
代替 zipfile.Path
可以提前体验这些更改。
PyZipFile 对象¶
PyZipFile
构造函数接受与 ZipFile
构造函数相同的参数,以及一个额外的参数 optimize。
- class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)¶
在 3.2 版本中变更: 添加了 optimize 参数。
在 3.4 版本中更改: 默认启用 ZIP64 扩展。
实例除了
ZipFile
对象的方法外,还具有一个方法- writepy(pathname, basename='', filterfunc=None)¶
搜索文件
*.py
并将相应的文件添加到存档中。如果
PyZipFile
的 optimize 参数未给定或为-1
,则相应的文件是一个*.pyc
文件,必要时会进行编译。如果
PyZipFile
的 optimize 参数为0
、1
或2
,则只有具有该优化级别的文件(请参阅compile()
)会被添加到存档中,必要时会进行编译。如果 pathname 是一个文件,则文件名必须以
.py
结尾,并且只在顶层添加(相应的*.pyc
)文件(不含路径信息)。如果 pathname 是一个不以.py
结尾的文件,则会引发RuntimeError
。如果它是一个目录,并且该目录不是包目录,则所有*.pyc
文件都会在顶层添加。如果该目录是一个包目录,则所有*.pyc
文件都将作为文件路径在包名称下添加,并且如果任何子目录是包目录,则所有这些都将以排序的顺序递归添加。basename 仅供内部使用。
filterfunc 如果给定,必须是一个接受单个字符串参数的函数。在将其添加到存档之前,会将每个路径(包括每个单独的完整文件路径)传递给它。如果 filterfunc 返回一个假值,则不会添加该路径,并且如果它是一个目录,则会忽略其内容。例如,如果我们的测试文件都位于
test
目录中或以字符串test_
开头,则可以使用 filterfunc 将它们排除在外>>> zf = PyZipFile('myprog.zip') >>> def notests(s): ... fn = os.path.basename(s) ... return (not (fn == 'test' or fn.startswith('test_'))) ... >>> zf.writepy('myprog', filterfunc=notests)
writepy()
方法创建具有如下文件名的存档string.pyc # Top level name test/__init__.pyc # Package directory test/testall.pyc # Module test.testall test/bogus/__init__.pyc # Subpackage directory test/bogus/myfile.pyc # Submodule test.bogus.myfile
在 3.4 版本中变更: 添加了 filterfunc 参数。
在 3.6.2 版本中变更: pathname 参数接受 路径型对象。
在 3.7 版本中变更: 递归会对目录条目进行排序。
ZipInfo 对象¶
ZipInfo
类的实例由 getinfo()
和 infolist()
方法返回 ZipFile
对象。每个对象都存储有关 ZIP 存档的单个成员的信息。
有一个类方法可以为文件系统文件创建一个 ZipInfo
实例
- classmethod ZipInfo.from_file(filename, arcname=None, *, strict_timestamps=True)¶
在准备将其添加到 zip 文件时,为文件系统上的文件构造一个
ZipInfo
实例。filename 应该是文件系统上文件或目录的路径。
如果指定了 arcname,则将其用作存档中的名称。如果未指定 arcname,则该名称将与 filename 相同,但会删除任何驱动器号和前导路径分隔符。
当 strict_timestamps 参数设置为
False
时,允许压缩早于 1980-01-01 的文件,但代价是将时间戳设置为 1980-01-01。 对于晚于 2107-12-31 的文件,也会出现类似的行为,时间戳也会设置为该限制值。在 3.6 版本中添加。
在 3.6.2 版本中变更: filename 参数接受 路径型对象。
在 3.8 版本中变更: 添加了 strict_timestamps 仅限关键字参数。
实例具有以下方法和属性
- ZipInfo.is_dir()¶
如果此存档成员是目录,则返回
True
。这使用条目的名称:目录应始终以
/
结尾。在 3.6 版本中添加。
- ZipInfo.filename¶
存档中文件的名称。
- ZipInfo.date_time¶
存档成员上次修改的时间和日期。这是一个包含六个值的元组
索引
值
0
年份(>= 1980)
1
月份(从一开始)
2
月份中的日期(从一开始)
3
小时(从零开始)
4
分钟(从零开始)
5
秒(从零开始)
注解
ZIP 文件格式不支持 1980 年之前的 时间戳。
- ZipInfo.compress_type¶
存档成员的压缩类型。
- ZipInfo.extra¶
扩展字段数据。 PKZIP 应用程序注释包含有关此
bytes
对象中包含的数据的内部结构的一些注释。
- ZipInfo.create_system¶
创建 ZIP 存档的系统。
- ZipInfo.create_version¶
创建 ZIP 存档的 PKZIP 版本。
- ZipInfo.extract_version¶
提取归档所需的 PKZIP 版本。
- ZipInfo.reserved¶
必须为零。
- 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¶
未压缩文件的大小。
命令行界面¶
zipfile
模块提供了一个简单的命令行界面,用于与 ZIP 归档文件进行交互。
如果要创建一个新的 ZIP 归档文件,请在 -c
选项后指定其名称,然后列出应包含的文件名。
$ python -m zipfile -c monty.zip spam.txt eggs.txt
也可以传递一个目录。
$ python -m zipfile -c monty.zip life-of-brian_1979/
如果要将 ZIP 归档文件解压到指定的目录中,请使用 -e
选项。
$ python -m zipfile -e monty.zip target-dir/
要列出 ZIP 归档文件中的文件,请使用 -l
选项。
$ python -m zipfile -l monty.zip
命令行选项¶
解压缩的陷阱¶
由于以下列出的某些陷阱,zipfile 模块中的提取可能会失败。
来自文件本身¶
由于密码/CRC 校验和/ZIP 格式不正确或不支持的压缩方法/解密,解压缩可能会失败。
文件系统限制¶
超出不同文件系统的限制会导致解压缩失败。例如,目录条目中允许的字符、文件名的长度、路径名的长度、单个文件的大小以及文件数量等。
资源限制¶
内存或磁盘空间不足会导致解压缩失败。例如,解压缩炸弹(也称为 ZIP 炸弹)适用于 zipfile 库,这可能会导致磁盘空间耗尽。
中断¶
解压缩期间的中断,例如按下 Control-C 或终止解压缩进程,可能会导致归档文件解压缩不完整。
提取的默认行为¶
不了解默认提取行为可能会导致意外的解压缩结果。例如,当两次提取同一个归档文件时,它会在不询问的情况下覆盖文件。