做自由与创造的先行者

数据压缩 | Data Compression zipfile

Python开发手册    

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

此模块目前不处理多磁盘ZIP文件。它可以处理使用ZIP64扩展名的ZIP文件(即大小超过4 GB的ZIP文件)。它支持在ZIP压缩文件中解密加密文件,但它目前不能创建加密文件。解密过程非常缓慢,因为它在本地Python而不是C中实现。

该模块定义了以下项目:

exception zipfile.BadZipfile

错误的ZIP文件(旧名称:)提出的错误zipfile.error。

exception zipfile.LargeZipFile

ZIP文件需要ZIP64功能但尚未启用时引发的错误。

class zipfile.ZipFile

用于读写ZIP文件的类。有关构造函数的详细信息,请参见ZipFile Objects部分。

class zipfile.PyZipFile

用于创建包含Python库的ZIP存档的类。

class zipfile.ZipInfo([filename[, date_time]])

用于表示关于档案成员的信息的类。这个类的实例由对象的方法getinfo()和infolist()方法返回ZipFile。该zipfile模块的大多数用户不需要创建这些,但只能使用由该模块创建的那些用户。文件名应该是档案成员的全名,并且date_time应该是包含六个字段的元组,其描述对文件的最后修改的时间; 这些字段在ZipInfo对象中进行了描述。

zipfile.is_zipfile(filename)

返回True如果文件名是基于它的幻数有效的ZIP文件,否则回报False。文件名也可以是文件或类似文件的对象。

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

zipfile.ZIP_STORED

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

zipfile.ZIP_DEFLATED

常用ZIP压缩方法的数字常量。这需要zlib模块。目前不支持其他压缩方法。

1. ZipFile对象

class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])

打开一个ZIP文件,其中文件可以是文件路径(字符串)或文件类型的对象。该模式参数应该是'r'读取现有的文件,'w'以截断并写入一个新的文件,或'a'将追加到现有文件。如果模式是,'a'并且文件引用了现有的ZIP文件,则会向其中添加其他文件。如果文件没有引用ZIP文件,则新的ZIP归档文件被追加到文件中。这是为了将ZIP压缩文件添加到其他文件(如python.exe)。

在版本2.6中更改:如果模式是,a并且该文件根本不存在,则会创建它。

压缩是编写压缩文件时使用的ZIP压缩方法,应该是ZIP_STORED或ZIP_DEFLATED; 无法识别的值会导致RuntimeError提高。如果ZIP_DEFLATED被指定,但zlib模块不可用,RuntimeError也会引发。默认是ZIP_STORED。如果allowZip64是Truezipfile,则会在zip文件大于2 GB时创建使用ZIP64扩展名的ZIP文件。如果它是假的(默认)zipfile会在ZIP文件需要ZIP64扩展时引发异常。默认情况下禁用ZIP64扩展,因为Unix上的默认zip和unzip命令(InfoZIP实用程序)不支持这些扩展。

改变在2.7.1版本:如果文件与模式创建'a'或'w'再closed不添加任何文件到归档,一个空归档适当的ZIP结构将被写入该文件。

ZipFile也是一个上下文管理器,因此支持该with语句。在这个例子中,myzip在with语句套件完成后关闭- 即使发生异常:

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

myzip.write('eggs.txt')

复制

2.7版新增功能:增加了ZipFile用作上下文管理器的功能。

ZipFile.close()

关闭档案文件。您必须close()在退出程序之前拨打电话,否则不会写入重要记录。

ZipFile.getinfo(name)

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

ZipFile.infolist()

返回包含ZipInfo每个档案成员的对象的列表。如果打开了现有的存档,则这些对象与磁盘上实际ZIP文件中的条目顺序相同。

ZipFile.namelist()

按名称返回存档成员列表。

ZipFile.open(name[, mode[, pwd]])

从存档中提取成员为文件类对象(ZipExtFile)。name是档案中文件的名称或ZipInfo对象。所述模式参数,如果包括的话,必须是下列之一:'r'(默认值),'U'或'rU'。在只读对象中选择'U'或'rU'将启用通用换行支持。pwd是用于加密文件的密码。调用open()一个封闭的ZipFile将引发一个RuntimeError。

注释

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

注释

如果通过传入类文件对象作为构造函数的第一个参数来创建ZipFile,那么通过open()共享ZipFile的文件指针返回的对象。在这些情况下,open()在ZipFile对象上执行任何其他操作之后,不应该使用返回的对象。如果ZipFile是通过传入一个字符串(文件名)作为构造函数的第一个参数来open()创建的,那么将创建一个新的文件对象,该对象将由ZipExtFile保存,允许它独立于ZipFile进行操作。

注释

open(),read()和extract()方法可利用一个文件名或ZipInfo对象。尝试阅读包含具有重复名称的成员的ZIP文件时,您会明白这一点。

2.6版本中的新功能。

ZipFile.extract(member[, path[, pwd]])

将存档中的成员提取到当前工作目录; 成员必须是其全名或ZipInfo对象)。其文件信息尽可能准确地提取。路径指定要提取到的不同目录。成员可以是文件名或ZipInfo对象。pwd是用于加密文件的密码。

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

2.6版本中的新功能。

注释

如果成员的文件名是绝对路径,驱动/ UNC SharePoint和领导(回)斜线将被剥离,如:///foo/bar成为foo/bar在Unix,并C:\foo\bar成为foo\bar在Windows上。".."成员文件名中的所有组件都将被删除,例如:../../foo../../ba..r成为foo../ba..r。在Windows非法字符(:,<,>,|,",?,并*用下划线代替)( _)。

ZipFile.extractall([path[, members[, pwd]]])

将存档中的所有成员提取到当前工作目录。路径指定要提取到的不同目录。成员是可选的,并且必须是返回列表的子集namelist()。pwd是用于加密文件的密码。

警告

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

在2.7.4版本中进行了更改:zipfile模块试图阻止该问题。见extract()注。

2.6版本中的新功能。

ZipFile.printdir()

打印存档的目录到sys.stdout。

ZipFile.setpassword(pwd)

将pwd设置为默认密码以提取加密文件。

2.6版本中的新功能。

ZipFile.read(name[, pwd])

返回档案中文件名称的字节。name是档案中文件的名称或ZipInfo对象。档案必须打开才能阅读或追加。pwd是用于加密文件的密码,如果指定,它将覆盖使用默认密码设置setpassword()。调用read()一个封闭的ZipFile将引发一个RuntimeError。

在版本2.6中更改:pwd已添加,名称现在可以是ZipInfo对象。

ZipFile.testzip()

阅读档案中的所有文件,并检查它们的CRC和文件头。返回第一个错误文件的名称,否则返回None。调用testzip()一个封闭的ZipFile将引发一个RuntimeError。

ZipFile.write(filename[, arcname[, compress_type]])

写命名的文件的文件名到归档,给它存档名称arcname(默认情况下,这将是相同的文件名,但没有一个驱动器号和与领先的路径分隔符删除)。如果给定,compress_type将为新条目覆盖为压缩参数给构造函数指定的值。归档文件必须以模式打开,'w'或者'a'- 调用write()使用模式创建的ZipFile 'r'将引发一个RuntimeError。调用write()一个封闭的ZipFile将引发一个RuntimeError。

注释

ZIP文件没有官方文件名编码。如果你有unicode文件名,你必须在将它们传递给你所需的编码之前将它们转换为字节串write()。WinZip将所有文件名解释为在CP437中编码,也称为DOS Latin。

注释

档案名称应该与档案根目录相关,也就是说,它们不应该以路径分隔符开头。

注释

如果arcname(或者filename如果arcname未给出)包含空字节,则归档文件的名称将在空字节处截断。

ZipFile.writestr(zinfo_or_arcname, bytes[, compress_type])

将字符串字节写入存档; zinfo_or_arcname是它将在档案中给出的文件名称,或者是一个ZipInfo实例。如果它是一个实例,至少必须给出文件名,日期和时间。如果是名称,则日期和时间设置为当前日期和时间。档案必须用模式打开'w'或'a'- 调用writestr()一个用模式创建的ZipFile 'r'会引发一个RuntimeError。调用writestr()一个封闭的ZipFile将引发一个RuntimeError。

如果给定,compress_type将覆盖为新条目的构造函数提供的压缩参数的值,或覆盖zinfo_or_arcname(如果是ZipInfo实例)的值。

注释

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

在版本2.7中更改:compress_type参数。

以下数据属性也可用:

ZipFile.debug

要使用的调试输出的级别。这可以从0(默认,无输出)到3(最多输出)设置。调试信息被写入sys.stdout。

ZipFile.comment

与ZIP文件关联的评论文本。如果为ZipFile使用模式'a'或'w'创建的实例分配注释,这应该是不超过65535字节的字符串。比此更长的评论在close()被调用时会在书面存档中被截断。

2. PyZipFile对象

该PyZipFile构造函数将相同的参数ZipFile构造函数。实例除了那些ZipFile对象外还有一种方法。

PyZipFile.writepy(pathname[, basename])

搜索文件*.py并将相应的文件添加到存档。*.pyo如果可用的话,相应的文件是一个文件,否则是一个*.pyc文件,必要时编译。如果路径名是一个文件,则文件名必须以.py,并且只有(对应的*.py[co])文件被添加到顶层(无路径信息)。如果路径名是不是结束一个文件.py,一个RuntimeError将提高。如果它是一个目录,并且该目录不是一个包目录,则所有文件*.py[co]都将添加到顶层。如果该目录是一个包目录,则所有*.py[co]这些目录都将作为文件路径添加到包名下,如果有任何子目录是包目录,则所有这些都将递归添加。基本名仅供内部使用。该writepy()方法使用以下文件名进行归档:

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

复制

3. ZipInfo对象

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

实例具有以下属性:

ZipInfo.filename

归档文件的名称。

ZipInfo.date_time

上次修改归档成员的时间和日期。这是一个包含六个值的元组:

指数

0

年份(> = 1980年)

1

月份(基于单位)

2

一个月中的日(基于一)

3

小时(从零开始)

4

分钟(从零开始)

5

秒(零基)

注意

1980年以前,ZIP文件格式不支持时间戳。

ZipInfo.compress_type

归档成员的压缩类型。

ZipInfo.comment

评论个人档案成员。

ZipInfo.extra

扩展字段数据。在PKZIP应用笔记包含包含在该字符串数据的内部结构的一些意见。

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

未压缩文件的大小。

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

复制

4.1.命令行选项

-l <zipfile>

列出zipfile文件。

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

从源文件创建zipfile。

-e <zipfile> <output_dir>

将zipfile解压缩到目标目录中。

-t <zipfile>

纠错

测试zip文件是否有效。

网站建设开发|APP设计开发|小程序建设开发
下一篇:数据持久性 | Data Persistence anydbm
上一篇:数据压缩 | Data Compression tarfile