使用 Python 处理 ZIP 压缩文件 (zipfile)
ZIP 是最流行的文件格式之一,用于归档和压缩。它自 MSDOS 和 PC 时代就已存在,并被著名的 PKZIP 应用程序使用。
Python 标准库中的 zipfile 模块提供了用于创建、提取、读取和写入 ZIP 压缩文件的类。
ZipFile()
此函数从文件参数返回一个 ZipFile 对象,该参数可以是字符串或由内置 open() 函数创建的文件对象。该函数需要一个 mode 参数,其默认值为 'r',尽管它可以采用 'w' 或 'a' 值,分别以读取、写入或追加模式打开压缩文件。
默认情况下,压缩文件未压缩。要指定要使用的压缩算法类型,必须将其中一个常量分配给 compression 参数。
zipfile.ZIP_STORED | 用于未压缩的压缩文件成员。 |
zipfile.ZIP_DEFLATED | 用于常用的 ZIP 压缩方法。这需要 zlib 模块。 |
zipfile.ZIP_BZIP2 | 用于 BZIP2 压缩方法。这需要 bz2 模块。 |
zipfile.ZIP_LZMA | 用于 LZMA 压缩方法。这需要 lzma 模块。 |
ZipFile 对象使用以下方法。
write()
此方法将文件添加到由 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()
read()
此方法读取压缩文件中特定文件的 data。
>>> 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
extract()
此方法默认将指定文件从压缩文件提取到当前目录或作为第二个参数给出的目录中。
>>> newzip.extract('json.txt','newdir') 'newdir\json.txt'
extractall()
此方法默认将压缩文件中的所有文件提取到当前目录。如果需要,请指定备用目录作为参数。
>>> newzip.extractall('newdir')
getinfo()
此方法返回对应于给定文件的 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 压缩文件时要应用的压缩算法在 compression 参数中指定。在以下代码中,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()
namelist()
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']
setpassword()
此方法设置密码参数,该参数必须在提取压缩文件时提供。
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 模块中的类和函数。