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,否则返回 Falsefilename 也可以是文件或类文件对象。

在 3.1 版本中更改: 支持文件和类文件对象。

zipfile.ZIP_STORED

未压缩的存档成员的数字常量。

zipfile.ZIP_DEFLATED

常规 ZIP 压缩方法的数字常量。这需要 zlib 模块。

zipfile.ZIP_BZIP2

BZIP2 压缩方法的数字常量。这需要 bz2 模块。

3.3 版本新增。

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_STOREDZIP_DEFLATEDZIP_BZIP2ZIP_LZMA;无法识别的值将导致引发 NotImplementedError。 如果指定了 ZIP_DEFLATEDZIP_BZIP2ZIP_LZMA,但相应的模块(zlibbz2lzma)不可用,则会引发 RuntimeError。 默认值为 ZIP_STORED

如果 allowZip64True(默认值),则当 zip 文件大于 4 GiB 时,zipfile 将创建使用 ZIP64 扩展名的 ZIP 文件。如果为 false,则当 ZIP 文件需要 ZIP64 扩展名时,zipfile 将引发异常。

compresslevel 参数控制将文件写入存档时使用的压缩级别。当使用 ZIP_STOREDZIP_LZMA 时,它不起作用。当使用 ZIP_DEFLATED 时,接受整数 09(有关详细信息,请参见 zlib)。当使用 ZIP_BZIP2 时,接受整数 19(有关详细信息,请参见 bz2)。

strict_timestamps 参数设置为 False 时,允许压缩早于 1980-01-01 的文件,但代价是将时间戳设置为 1980-01-01。 对于晚于 2107-12-31 的文件,也会出现类似的行为,时间戳也会设置为该限制值。

当模式为 'r' 时,可以将 metadata_encoding 设置为编解码器的名称,该名称将用于解码成员名称和 ZIP 注释等元数据。

如果文件是以模式 'w''x''a' 创建,然后在未向存档添加任何文件的情况下 closed,则会将空存档的相应 ZIP 结构写入该文件。

ZipFile 也是一个上下文管理器,因此支持 with 语句。在示例中,myzipwith 语句的套件完成后关闭,即使发生异常也是如此

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.3 版本中更改: 增加了对 bzip2lzma 压缩的支持。

在 3.4 版本中更改: 默认启用 ZIP64 扩展。

在 3.5 版本中更改: 增加了对写入不可查找的流的支持。增加了对 'x' 模式的支持。

在 3.6 版本中更改: 以前,对于无法识别的压缩值,会引发一个简单的 RuntimeError

在 3.6.2 版本中更改: file 参数接受 路径类对象

在 3.7 版本中更改: 添加了 compresslevel 参数。

在 3.8 版本中更改: strict_timestamps 仅关键字参数。

在 3.11 版本中更改: 增加了对指定 zip 文件目录和文件头中读取元数据的成员名称编码的支持。

ZipFile.close()

关闭存档文件。在退出程序之前必须调用 close(),否则将不会写入基本记录。

ZipFile.getinfo(name)

返回一个 ZipInfo 对象,其中包含有关存档成员 name 的信息。对当前未包含在存档中的名称调用 getinfo() 将引发 KeyError

ZipFile.infolist()

返回一个列表,其中包含归档文件中每个成员的 ZipInfo 对象。如果打开的是现有归档文件,则对象的顺序与其在磁盘上实际 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_sizeZipInfo 对象,并将其用作 name 参数。

注解

open()read()extract() 方法可以接受文件名或 ZipInfo 对象。当您尝试读取包含具有重复名称的成员的 ZIP 文件时,您会体会到这一点。

在 3.6 版本中更改: 删除了对 mode='U' 的支持。对于以 通用换行符 模式读取压缩文本文件,请使用 io.TextIOWrapper

在 3.6 版本中更改: ZipFile.open() 现在可以使用 mode='w' 选项将文件写入归档文件。

在 3.6 版本中更改: 在已关闭的 ZipFile 上调用 open() 将引发 ValueError。以前,会引发 RuntimeError

在 3.13 版本中更改: 为可写类文件对象添加了属性 namemode。可读类文件对象的 mode 属性的值从 'r' 更改为 'rb'

ZipFile.extract(member, path=None, pwd=None)

从归档文件中提取一个成员到当前工作目录;member 必须是其完整名称或一个 ZipInfo 对象。其文件信息将尽可能准确地提取。path 指定要提取到的其他目录。member 可以是文件名或 ZipInfo 对象。pwd 是用于加密文件的密码,类型为 bytes 对象。

返回创建的规范化路径(目录或新文件)。

注解

如果成员文件名是绝对路径,则会剥离驱动器/UNC 共享点和前导(反)斜杠,例如:///foo/bar 在 Unix 上变为 foo/barC:\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.setpassword(pwd)

设置 pwd (一个 bytes 对象) 作为提取加密文件的默认密码。

ZipFile.read(name, pwd=None)

返回归档文件中文件 name 的字节。name 是归档文件中文件的名称,或一个 ZipInfo 对象。归档文件必须以读取或追加模式打开。pwd 是用于加密文件的密码,以 bytes 对象的形式给出,如果指定,它会覆盖使用 setpassword() 设置的默认密码。对使用除 ZIP_STOREDZIP_DEFLATEDZIP_BZIP2ZIP_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,它可以是一个 strbytes 实例;如果它是一个 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

ZipFile.comment

与 ZIP 文件关联的注释,以 bytes 对象表示。 如果要向以模式 'w''x''a' 创建的 ZipFile 实例分配注释,则该注释的长度不应超过 65535 字节。 长度超出此限制的注释将被截断。

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(当以文本方式打开时),否则将被忽略。pwdZipFile.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

如果当前上下文引用符号链接,则返回 True

在 3.12 版本中加入。

在 3.13 版本中变更: 之前,is_symlink 会无条件返回 False

Path.exists()

如果当前上下文引用 zip 文件中的文件或目录,则返回 True

Path.suffix

最后一个组件中最后一个以点分隔的部分(如果有)。 这通常称为文件扩展名。

在 3.11 版本中加入: 添加了 Path.suffix 属性。

Path.stem

最终路径组件,不带其后缀。

在 3.11 版本中加入: 添加了 Path.stem 属性。

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 并将相应的文件添加到存档中。

如果 PyZipFileoptimize 参数未给定或为 -1,则相应的文件是一个 *.pyc 文件,必要时会进行编译。

如果 PyZipFileoptimize 参数为 012,则只有具有该优化级别的文件(请参阅 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.comment

单个存档成员的注释,作为 bytes 对象。

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

命令行选项

-l <zipfile>
--list <zipfile>

列出 zip 文件中的文件。

-c <zipfile> <source1> ... <sourceN>
--create <zipfile> <source1> ... <sourceN>

从源文件创建 zip 文件。

-e <zipfile> <output_dir>
--extract <zipfile> <output_dir>

将 zip 文件解压到目标目录。

-t <zipfile>
--test <zipfile>

测试 zip 文件是否有效。

--metadata-encoding <encoding>

指定 -l-e-t 的成员名称的编码。

在 3.11 版本中加入。

解压缩的陷阱

由于以下列出的某些陷阱,zipfile 模块中的提取可能会失败。

来自文件本身

由于密码/CRC 校验和/ZIP 格式不正确或不支持的压缩方法/解密,解压缩可能会失败。

文件系统限制

超出不同文件系统的限制会导致解压缩失败。例如,目录条目中允许的字符、文件名的长度、路径名的长度、单个文件的大小以及文件数量等。

资源限制

内存或磁盘空间不足会导致解压缩失败。例如,解压缩炸弹(也称为 ZIP 炸弹)适用于 zipfile 库,这可能会导致磁盘空间耗尽。

中断

解压缩期间的中断,例如按下 Control-C 或终止解压缩进程,可能会导致归档文件解压缩不完整。

提取的默认行为

不了解默认提取行为可能会导致意外的解压缩结果。例如,当两次提取同一个归档文件时,它会在不询问的情况下覆盖文件。