使用Python处理ZIP档案(zipfile)

ZIP是用于归档和压缩的最受欢迎的文件格式之一。自从MSDOS和PC以来,它就一直在使用,并且已被著名的PKZIP应用程序使用。

Python标准库中的zipfile模块提供了一些类,这些类可简化用于创建,提取,读取和写入ZIP档案的工具。

ZipFile()

此函数从文件参数返回ZipFile对象,该文件参数可以是内置open()函数创建的字符串或文件对象。该函数需要一个模式参数,其默认值为'r',尽管它可以采用'w'或'a'值分别以读,写或追加模式打开存档。

默认情况下,存档是未压缩的。要指定要使用的压缩算法的类型,必须将常量之一分配给压缩参数。

zipfile.ZIP_STORED对于未压缩的存档成员。
zipfile.ZIP_DEFLATED通常的ZIP压缩方法。这需要zlib模块。
zipfile.ZIP_BZIP2用于BZIP2压缩方法。这需要bz2模块。
zipfile.ZIP_LZMA用于LZMA压缩方法。这需要lzma模块。

ZipFile对象使用以下方法。

写()

该方法将文件交给ZipFile对象表示的档案。

>>> import zipfile
>>> newzip=zipfile.ZipFile('newdir/newzip.zip','w')
>>> newzip.write('zen.txt')
>>> newzip.close()

通过以附加模式(“ a”作为模式)打开附加文件,可以将其添加到现有存档中

>>> newzip=zipfile.ZipFile('newdir/newzip.zip','a')
>>> newzip.write('zen.txt')
>>> newzip.close()

读()

此方法从存档中的特定文件读取数据。

>>> newzip=zipfile.ZipFile('newdir/newzip.zip','r')
>>> data=newzip.read('json.txt')
>>> data
b'["Rakesh", {"marks": [50, 60, 70]}]'

printdir()

此方法列出给定存档中的所有文件。

>>> newzip.printdir()
File Name Modified Size
json.txt 2018-11-2717:04:40 35
zen.txt 2018-11-2523:13:44 878

提取()

此方法默认情况下从存档中提取指定文件到当前目录或作为其第二个参数指定的文件。

>>> newzip.extract('json.txt','newdir')
'newdir\\json.txt'

提取所有()

默认情况下,此方法将存档中的所有文件提取到当前目录。如果需要,请指定备用目录作为参数。

>>> newzip.extractall('newdir')

获取信息()

此方法返回与给定文件相对应的ZipInfo对象。ZipInfo对象包含文件的不同元数据信息。

以下代码从存档中获取“ zen.txt”的ZipInfo对象,并从中获取文件名,大小和日期时间信息。

>>> inf = newzip.getinfo('zen.txt')
>>> inf.filename,inf.file_size, inf.date_time
('zen.txt', 878, (2018, 11, 25, 23, 13, 45))

infolist()

此方法返回存档中所有文件的ZipInfo对象的列表。

>>> newzip.infolist()
[<ZipInfo filename = 'json.txt' filemode='-rw-rw-rw-' file_size=35>, <ZipInfo filename = 'zen.txt' filemode='-rw-rw-rw-' file_size=878>]

如前 ,在压缩参数中指定在构建ZIP归档文件时要应用的压缩算法。在以下代码中,ZIP-DEFLATED常量使用zlib压缩构建存档。

>>> zipobj = zipfile.ZipFile('txtzip.zip',mode='w', compression=zipfile.ZIP_DEFLATED)
>>> files=glob.glob("*.txt")
>>> for file in files:
zipobj.write(file)
>>> zipobj.close()

名单()

ZipFile对象的此方法返回存档中所有文件的列表。

>>> zipobj = zipfile.ZipFile('txtzip.zip',mode='r')
>>> zipobj.namelist()
['a!.txt', 'data().txt', 'dict.txt', 'json.txt', 'LICENSE.txt', 'lines.txt', 'msg.txt', 'NEWS.txt', 'test.txt/', 'zen.txt', 'zen1.txt', 'zenbak.txt']

设置密码()

此方法设置在提取存档时必须提供的密码参数。

PyZipFile()

zipfile模块中的此函数返回PyZipFile对象。PyZipFile对象可以构造一个包含扩展名为.py的文件的模块。可以将此归档文件添加到sys.path环境变量中,以便可以使用zipimport模块导入该模块。

writepy()方法将.py文件编译为相应的.pyc文件后,将其添加到存档中。

files=glob.glob("*.py")
>>> pyzipobj = zipfile.PyZipFile('pyfiles/pyzip.zip', mode='w', compression=zipfile.ZIP_LZMA)
>>> for file in files:
pyzipobj.writepy(file)
>>> pyzipobj.close()

本文讨论了zipfile模块中的类和函数。