12.4. zipfile —使用 ZIPFiles

1.6 版中的新Function。

源代码: Lib/zipfile.py


ZIP 文件格式是一种常见的存档和压缩标准。该模块提供了用于创建,读取,写入,附加和列出 ZIP 文件的工具。对该模块的任何高级用法都需要了解PKZIP 应用说明中定义的格式。

该模块当前不处理多磁盘 ZIP 文件。它可以处理使用 ZIP64extensions 的 ZIP 文件(即,大小超过 4 GB 的 ZIP 文件)。它支持对 ZIP 存档中的加密文件进行解密,但是当前无法创建加密文件。解密非常慢,因为它是在本机 Python 中而不是 C 中实现的。

该模块定义以下各项:

在 2.7 版中更改:支持文件和类似文件的对象。

See also

  • PKZIP 应用说明

  • ZIP 文件格式的文档,作者是 Phil Katz,他是该格式和算法的创建者。

  • Info-ZIP 主页

  • 有关 Info-ZIP 项目的 ZIP 存档程序和开发库的信息。

12.4.1. ZipFile 对象

在 2.6 版中进行了更改:如果* mode *为a并且该文件根本不存在,则会创建该文件。

在版本 2.7.1 中进行了更改:如果使用'a''w',然后使用closed模式创建了文件,而未将任何文件添加到存档中,则用于空存档的适当 ZIP 结构将被写入文件。

ZipFile 还是上下文 Management 器,因此支持with语句。在示例中,* myzip *在with语句的套件完成后关闭-即使发生异常:

with ZipFile('spam.zip', 'w') as myzip:
    myzip.write('eggs.txt')

2.7 版的新Function:添加了使用ZipFile作为上下文 Management 器的Function。

Note

类文件对象是只读的,并提供以下方法:read()readline()readlines()iter()next()

Note

如果 ZipFile 是pass将类似文件的对象作为构造函数的第一个参数传递而创建的,则open()返回的对象将共享 ZipFile 的文件指针。在这种情况下,在 ZipFile 对象上执行任何其他操作后,不应使用open()返回的对象。如果 ZipFile 是pass将字符串(文件名)作为构造函数的第一个参数传入而创建的,则open()将创建一个新文件对象,该对象将由 ZipExtFile 保存,从而使其能够独立于 ZipFile 进行操作。

Note

open()read()extract()方法可以使用文件名或ZipInfo对象。当您try读取包含名称重复的成员的 ZIP 文件时,您将不胜感激。

2.6 版的新Function。

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

2.6 版的新Function。

Note

如果成员文件名是绝对路径,则将删除驱动器/ UNC 共享点和前导(反)斜杠,例如:在 Unix 上///foo/bar变为foo/bar,在 Windows 上C:\foo\bar变为foo\bar。并且成员文件名中的所有".."组件将被删除,例如../../foo../../ba..r变为foo../ba..r。在 Windows 上,非法字符(:<>|"?*)下划线(_)代替。

Warning

未经事先检查,切勿从不受信任的来源中提取 Files。文件可能是在* path *之外创建的,例如具有以"/"开头的绝对文件名或带有两个点".."的文件名的成员。

在版本 2.7.4 中更改:zipfile 模块try阻止这种情况。请参阅extract()注意。

2.6 版的新Function。

2.6 版的新Function。

在 2.6 版中进行了更改:添加了* pwd name *现在可以是ZipInfo对象。

Note

没有用于 ZIP 文件的正式文件名编码。如果您具有 unicode 文件名,则必须将它们转换为所需编码的字节字符串,然后再将其传递给write()。 WinZip 将所有文件名解释为以 CP437(也称为 DOS Latin)编码。

Note

存档名称应相对于存档根目录,即,它们不应以路径分隔符开头。

Note

如果arcname(或filename,如果未提供arcname)包含一个空字节,则存档中文件的名称将在该空字节处被截断。

如果给定,* compress_type 会为新条目的构造函数或 zinfo_or_arcname (如果是ZipInfo实例)覆盖为 compression *参数赋予的值。

Note

当将ZipInfo实例作为* zinfo_or_arcname 参数传递时,使用的压缩方法将是给定ZipInfo实例的 compress_type *成员中指定的压缩方法。默认情况下,ZipInfo构造函数将此成员设置为ZIP_STORED

在 2.7 版中进行了更改:* compress_type *参数。

以下数据属性也可用:

12.4.2. PyZipFile 对象

PyZipFile构造函数采用与ZipFile构造函数相同的参数。除了ZipFile对象的实例之外,实例还具有一种方法。

string.pyc                                # Top level name
test/__init__.pyc                         # Package directory
test/test_support.pyc                          # Module test.test_support
test/bogus/__init__.pyc                   # Subpackage directory
test/bogus/myfile.pyc                     # Submodule test.bogus.myfile

12.4.3. ZipInfo 对象

ZipInfo类的实例由ZipFile对象的getinfo()infolist()方法返回。每个对象都存储有关 ZIP 存档的单个成员的信息。

实例具有以下属性:

Index Value
0 年(> = 1980)
1 Month (one-based)
2 一个月中的某天(基于 1 天)
3 Hours (zero-based)
4 Minutes (zero-based)
5 Seconds (zero-based)

Note

ZIP 文件格式不支持 1980 年之前的时间戳。

12.4.4. 命令行界面

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

12.4.4.1. 命令行选项

首页