zipfile
zipfile — Work with ZIP archives
1.6版新增功能
源代码:
Lib / zipfile.py
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
是True
zipfile
,则会在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文件是否有效。