zipfile
— 处理 ZIP 存档¶
源代码: Lib/zipfile/
ZIP 文件格式是一种常见的存档和压缩标准。本模块提供创建、读取、写入、追加和列出 ZIP 文件的工具。任何高级使用本模块都需要理解该格式,该格式定义在 PKZIP 应用程序说明中。
本模块目前不处理多盘 ZIP 文件。它可以处理使用 ZIP64 扩展(即大小超过 4 GiB 的 ZIP 文件)的 ZIP 文件。它支持解密 ZIP 存档中的加密文件,但目前无法创建加密文件。解密速度极慢,因为它是用原生 Python 而不是 C 实现的。
本模块定义了以下项
- 异常 zipfile.BadZipFile¶
无效 ZIP 文件引发的错误。
在 3.2 版本加入。
- 异常 zipfile.BadZipfile¶
BadZipFile
的别名,用于兼容旧版 Python。自 3.2 版本弃用。
- 异常 zipfile.LargeZipFile¶
当 ZIP 文件需要 ZIP64 功能但未启用时引发的错误。
- 类 zipfile.ZipFile
用于读取和写入 ZIP 文件的类。有关构造函数的详细信息,请参阅 ZipFile 对象 部分。
- 类 zipfile.Path
实现
pathlib.Path
提供的接口子集的类,包括完整的importlib.resources.abc.Traversable
接口。在 3.8 版本加入。
- 类 zipfile.PyZipFile
用于创建包含 Python 库的 ZIP 存档的类。
- 类 zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0))¶
用于表示存档成员信息的类。
ZipFile
对象的getinfo()
和infolist()
方法会返回此类的实例。大多数zipfile
模块的用户不需要创建这些实例,只需使用本模块创建的实例。filename 应该是存档成员的完整名称,date_time 应该是一个包含六个字段的元组,描述文件最后修改时间;这些字段在 ZipInfo 对象 部分有描述。在 3.13 版本中更改: 添加了一个公共的
compress_level
属性,以公开以前受保护的_compresslevel
。为了向后兼容,旧的受保护名称仍然作为属性工作。- _for_archive(archive)¶
将 date_time、压缩属性和外部属性解析为
ZipFile.writestr()
使用的合适默认值。返回自身以进行链式调用。
在 3.14 版本加入。
- zipfile.is_zipfile(filename)¶
如果 filename 是一个有效的 ZIP 文件(根据其魔术数字),则返回
True
,否则返回False
。filename 也可以是文件或类文件对象。在 3.1 版本中更改: 支持文件和类文件对象。
- zipfile.ZIP_STORED¶
未压缩存档成员的数字常量。
- zipfile.ZIP_ZSTANDARD¶
Zstandard 压缩的数字常量。这需要
compression.zstd
模块。备注
在 APPNOTE 6.3.7 中,方法 ID
20
分配给 Zstandard 压缩。这在 APPNOTE 6.3.8 中更改为方法 ID93
,以避免冲突,方法 ID20
被弃用。为了兼容性,zipfile
模块读取这两个方法 ID,但只写入方法 ID93
的数据。在 3.14 版本加入。
备注
ZIP 文件格式规范自 2001 年以来已包含对 bzip2 压缩的支持,自 2006 年以来对 LZMA 压缩的支持,自 2020 年以来对 Zstandard 压缩的支持。然而,一些工具(包括旧版 Python)不支持这些压缩方法,可能会完全拒绝处理 ZIP 文件,或者无法提取单个文件。
参见
- PKZIP 应用程序说明
Phil Katz(该格式和所用算法的创建者)提供的 ZIP 文件格式文档。
- Info-ZIP 主页
有关 Info-ZIP 项目的 ZIP 存档程序和开发库的信息。
ZipFile 对象¶
- 类 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
或ZIP_ZSTANDARD
;无法识别的值将引发NotImplementedError
。如果指定了ZIP_DEFLATED
、ZIP_BZIP2
、ZIP_LZMA
或ZIP_ZSTANDARD
,但相应的模块(zlib
、bz2
、lzma
或compression.zstd
)不可用,则会引发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
)。当使用ZIP_ZSTANDARD
时,通常接受整数-131072
到22
(有关检索有效值及其含义的更多信息,请参阅CompressionParameter.compression_level
)。当 strict_timestamps 参数设置为
False
时,允许压缩早于 1980-01-01 的文件,代价是将时间戳设置为 1980-01-01。对于晚于 2107-12-31 的文件,也会发生类似的行为,时间戳也会设置为限制。当模式为
'r'
时,可以设置 metadata_encoding 为编解码器的名称,该编解码器将用于解码元数据,例如成员名称和 ZIP 注释。如果文件以
'w'
、'x'
或'a'
模式创建,然后在未向存档添加任何文件的情况下关闭
,则会向文件中写入空存档的相应 ZIP 结构。ZipFile 也是一个上下文管理器,因此支持
with
语句。在示例中,在with
语句的代码块完成后,即使发生异常,myzip 也会关闭。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 版本中更改: 现在可以使用
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()
设置的默认密码。如果 ZipFile 使用除ZIP_STORED
、ZIP_DEFLATED
、ZIP_BZIP2
、ZIP_LZMA
或ZIP_ZSTANDARD
之外的压缩方法,则调用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
(如果未给定arcname
,则为filename
)包含空字节,则存档中的文件名将在空字节处被截断。备注
文件名中的前导斜杠可能导致某些 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(如果它是
ZipInfo
实例)的 compression 参数指定的值。同样,如果给出 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
。
路径对象¶
- 类 zipfile.Path(root, at='')¶
从
root
zipfile 构造一个 Path 对象(它可以是ZipFile
实例或适合传递给ZipFile
构造函数的file
)。at
指定此路径在 zipfile 中的位置,例如“dir/file.txt”、“dir/”或“”。默认为空字符串,表示根目录。备注
Path
类不会清理 ZIP 存档中的文件名。与ZipFile.extract()
和ZipFile.extractall()
方法不同,调用者有责任验证或清理文件名以防止路径遍历漏洞(例如,包含“..”或绝对路径的文件名)。处理不受信任的存档时,请考虑使用os.path.abspath()
解析文件名并使用os.path.commonpath()
检查目标目录。
Path 对象公开了 pathlib.Path
对象的以下功能
Path 对象可以使用 /
运算符或 joinpath
进行遍历。
- 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。
- 类 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 对象¶
ZipFile
对象的 getinfo()
和 infolist()
方法会返回 ZipInfo
类的实例。每个对象存储有关 ZIP 存档单个成员的信息。
有一个类方法用于为文件系统文件创建 ZipInfo
实例。
- classmethod ZipInfo.from_file(filename, arcname=None, *, strict_timestamps=True)¶
为文件系统上的文件构造
ZipInfo
实例,以准备将其添加到 zip 文件中。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¶
归档成员上次修改的时间和日期。这是一个包含六个值的元组,表示 ZIP 文件的中心目录中的“上次 [修改] 文件时间”和“上次 [修改] 文件日期”字段。
元组包含
索引
值
0
年份(>= 1980)
1
月份(从 1 开始)
2
月份中的日期(从 1 开始)
3
小时(从 0 开始)
4
分钟(从 0 开始)
5
秒(从 0 开始)
备注
ZIP 格式支持在不同位置(中心目录、NTFS/UNIX 系统的附加字段等)的多个时间戳字段。此属性特别返回中心目录中的时间戳。ZIP 文件中的中心目录时间戳格式不支持 1980 年之前的时间戳。虽然某些附加字段格式(例如 UNIX 时间戳)可以表示更早的日期,但此属性仅返回中心目录时间戳。
中心目录时间戳被解释为表示本地时间,而不是 UTC 时间,以匹配其他 zip 工具的行为。
- 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 库,可能导致磁盘空间耗尽。
中断¶
解压过程中的中断,例如按下 Ctrl-C 或终止解压进程,可能导致归档解压不完整。
解压的默认行为¶
不了解默认解压行为可能导致意外的解压结果。例如,当两次解压同一个归档时,它会在不询问的情况下覆盖文件。