ZIP文件(带有 .zip
文件扩展名)是一种常见的压缩文件格式,它可以包含许多其他文件的压缩内容。
压缩一个文件会减少它的大小,这在因特网上传输时很有用。
因为一个ZIP文件可以包含多个文件和子文件夹,所以它是一种很方便的方式,将多个文件打包成一个文件。
这个文件叫做“归档文件”,可以用作电子邮件的附件,或其他用途。
利用 zipfile
模块中的函数,Python程序可以创建和打开(或解压)ZIP文件。
读取 ZIP
文件
要读取ZIP文件的内容,首先必须创建一个 ZipFile
对象 (请注意大写首字母Z和F)。
ZipFile
对象在概念上与 File
对象相似:它们是一些值,程序通过它们与文件打交道。
要创建一个ZipFile
对象,就调用 zipfile.ZipFile()
函数,向它传入一个字符串,如 .zip
文件的文件名。
请注意, zipfile
是Python模块的名称, ZipFile()
是函数的名称。
假定有一个名为 new.zip
的文件,在交互式环境中输入以下代码:
import zipfile, os
exampleZip = zipfile.ZipFile('xx_new.zip')
ZipFile
对象有一个 namelist()
方法,
返回ZIP文件中包含的所有文件和文件夹的字符串的列表。
通过函数查看压缩文件中的文件:
exampleZip.namelist()
['hello1.txt', 'hello2.txt']
这些字符串可以传递给 ZipFile
对象的 getinfo()
方法,
返回一个关于特定文件的 Ziplnfo
对象。
知道了具体的文件名称,可以查看其信息:
spamInfo = exampleZip.getinfo('hello1.txt')
Ziplnfo
对象有自己的属性,诸如表示字节数的 file_size
和 compress_size
,
它们分别表示原来文件大小和压缩后文件大小。
spamInfo.file_size
13
spamInfo.compress_size
15
ZipFile
对象表示整个归档文件,而 ZipInfo
对象则保存该归档文件中每个文件的有用信息。
'Compressed file is {}x smaller!'.format(round(spamInfo.file_size / spamInfo.compress_size, 2))
'Compressed file is 0.87x smaller!'
exampleZip.close()
import zipfile, os
os.chdir('.') # move to the folder with example.zip
exampleZip = zipfile.ZipFile('xx_new.zip')
exampleZip.extractall('xx_out')
exampleZip.close()
运行这段代码后, new.zip
的内容将被解压缩到 xx_out
文件夹;如果传递给 extractall()
方法的文件夹不存在,它会被创建。
或者,如果 extractall()
没有使用参数,文件会解压缩到当前文件夹。
ZipFile
对象的 extract()
方法从ZIP文件中解压缩单个文件。
继续交互式环境中的例子:
exampleZip = zipfile.ZipFile('xx_new.zip')
exampleZip.extract('hello1.txt')
'/home/jovyan/work/jupylab_houxue/pt04_essential/ch01_文件管理/hello1.txt'
exampleZip.extract('hello2.txt','.')
exampleZip.close()
传递给 extract()
的字符串,必须匹配 namelist()
返回的字符串列表中的一个。
或者,可以向 extract()
传递第二个参数,将文件解压缩到指定的文件夹,而不是当前工作目录。
如果第二个参数指定的文件夹不存在, Python 就会创建它。
extract()
的返回值是被压缩后文件的绝对路径。
创建和添加到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('xx_chapter.ipynb',compress_type=zipfile.ZIP_DEFLATED)
newZip.close()
这段代码将创建一个新的ZIP文件,名为 xx_new.zip
,它包含 chapter.ipynb
压缩后的内容。
要记住,就像写入文件一样,写模式( w
)将擦除ZIP文件中所有原有的内容。
如果只是希望将文件添加到原有的 ZIP 文件中,就要向 zipfile.ZipFile()
传入 'a'
作为第二个参数, 以添加模式打开 ZIP
文件。