ZIP文件(带有 .zip
文件扩展名)是一种常见的压缩文件格式,它可以包含许多其他文件的压缩内容。
压缩一个文件会减少它的大小,这在因特网上传输时很有用。
因为一个ZIP文件可以包含多个文件和子文件夹,所以它是一种很方便的方式,将多个文件打包成一个文件。
这个文件叫做“归档文件”,可以用作电子邮件的附件,或其他用途。
利用 zipfile
模块中的函数,Python程序可以创建和打开(或解压)ZIP文件。
创建和添加到ZIP文件
要创建自己的压缩ZIP文件,必须以“写模式”打开 ZipFile
对象,
即传入 'w'
作为第二个参数(这类似于向 open()
函数传入 'w'
以写模式打开一个文本文件)。
如果向 ZipFile
对象的 write()
方法传入一个路径,Python就会压缩该路径所指的文件,将它加到ZIP文件中。
write()
方法的第一个参数是一个字符串,代表要添加的文件名。
第二个参数是“压缩类型”参数,它告诉计算机使用怎样的算法来压缩文件。
可以总是将这个值设置为 zipfile.ZIP_DEFLATHD
(这指定了 deflate
压缩算法,它对各种类型的数据都很有效)。
在交互式环境中输入以下代码:
import zipfile
newZip = zipfile.ZipFile('xx_new2.zip', 'w')
newZip.write('/data/demo/example.xlsx',compress_type=zipfile.ZIP_DEFLATED)
newZip.close()
这段代码将创建一个新的ZIP文件,名为 xx_new.zip
,它包含 chapter.ipynb
压缩后的内容。
要记住,就像写入文件一样,写模式( w
)将擦除ZIP文件中所有原有的内容。
如果只是希望将文件添加到原有的 ZIP 文件中,就要向 zipfile.ZipFile()
传入 'a'
作为第二个参数, 以添加模式打开 ZIP
文件。
import zipfile, os
exampleZip = zipfile.ZipFile('xx_new2.zip')
ZipFile
对象有一个 namelist()
方法,
返回ZIP文件中包含的所有文件和文件夹的字符串的列表。
通过函数查看压缩文件中的文件:
exampleZip.namelist()
['data/demo/example.xlsx']
这些字符串可以传递给 ZipFile
对象的 getinfo()
方法,
返回一个关于特定文件的 Ziplnfo
对象。
知道了具体的文件名称,可以查看其信息:
file_obj = exampleZip.namelist()[0]
spamInfo = exampleZip.getinfo(file_obj)
Ziplnfo
对象有自己的属性,诸如表示字节数的 file_size
和 compress_size
,
它们分别表示原来文件大小和压缩后文件大小。
spamInfo.file_size
13677
spamInfo.compress_size
12641
ZipFile
对象表示整个归档文件,而 ZipInfo
对象则保存该归档文件中每个文件的有用信息。
'Compressed file is {}x smaller!'.format(round(spamInfo.file_size / spamInfo.compress_size, 2))
'Compressed file is 1.08x smaller!'
exampleZip.close()
import zipfile, os
os.chdir('.') # move to the folder with example.zip
exampleZip = zipfile.ZipFile('xx_new2.zip')
exampleZip.extractall('xx_out')
exampleZip.close()
运行这段代码后, new.zip
的内容将被解压缩到 xx_out
文件夹;如果传递给 extractall()
方法的文件夹不存在,它会被创建。
或者,如果 extractall()
没有使用参数,文件会解压缩到当前文件夹。
ZipFile
对象的 extract()
方法从ZIP文件中解压缩单个文件。
继续交互式环境中的例子:
exampleZip = zipfile.ZipFile('xx_new2.zip')
file_obj = exampleZip.namelist()[0]
# 缺省情况下解压到当前文件夹。
# exampleZip.extract(file_obj)
exampleZip.extract(file_obj,'/tmp')
exampleZip.close()
传递给 extract()
的字符串,必须匹配 namelist()
返回的字符串列表中的一个。
或者,可以向 extract()
传递第二个参数,将文件解压缩到指定的文件夹,而不是当前工作目录。
如果第二个参数指定的文件夹不存在, Python 就会创建它。
extract()
的返回值是被压缩后文件的绝对路径。