带有 .zip 扩展名的文件,是一个包含许多文件或文件夹的压缩包。因为压缩之后,不仅会减少一个文件的大小,还可以把需要传输的文件数降到最低(1 个),这样很适合网络传输。压缩包也称为归档包。
1 创建 ZIP 文件
要创建 ZIP 文件,必须以 “ 写模式 ” 打开 ZipFile 对象,即传入 ‘w’ 作为第二个参数。然后向 ZipFile 对象的 write() 方法传入需要压缩的文件名与压缩算法类型, Python 就会把它放入 ZIP 文件中。 write() 方法的第一个参数是一个字符串,代表要添加的文件名。第二个参数是 “ 压缩算法类型” 参数,它告诉计算机使用怎样的算法来压缩文件。
import os import zipfile ''' 创建 ZIP 文件 @author Deniro Li ''' os.chdir('F:\\temp') zip_file=zipfile.ZipFile('1.zip','w') zip_file.write('gc.log',compress_type=zipfile.ZIP_DEFLATED) zip_file.close()
compress_type 可选以下压缩算法类型:
类型 | 说明 |
---|---|
ZIP_STORED | 只是存储,不压缩。 |
ZIP_DEFLATED | DEFLATED 压缩算法,它同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。 |
ZIP_BZIP2 | BZIP2 压缩算法。 bzip2 采用新的压缩演算法,压缩效果比传统的 LZ77/LZ78 压缩演算法来得好。 |
ZIP_LZMA | LZMA 压缩算法。LZMA (Lempel-Ziv-Markov chain-Algorithm的缩写),是一个 Deflate 和 LZ77 算法改良和优化后的压缩算法。 |
注意: 写模式将擦除 ZIP 压缩包中所有原有的内容。如果只是希望将文件添加到原有的 ZIP 压缩包中,就要向 zipfile.ZipFile() 传入 ‘a’ 作为第二个参数,以添加模式打开 ZIP 压缩包,添加新的文件。
2 读取 ZIP 文件
import os import zipfile ''' 读取 ZIP 文件 ''' # 改变当前工作目录到需要读取的 ZIP 文件所在目录 os.chdir('F:\\temp') zip_file = zipfile.ZipFile('apache-maven-3.5.2-bin.zip') namelist = zip_file.namelist() print(' ZIP 内所包含的文件列表:' + str(namelist)) # 读取 ZIP 内的某个文件 readme_txt = zip_file.getinfo('apache-maven-3.5.2/README.txt') print('README.txt 文件原始大小:%s 字节;压缩后大小:%s 字节,压缩后比原来小了 %s 倍' % (readme_txt.file_size, readme_txt.compress_size, round(readme_txt.file_size / readme_txt.compress_size, 2) ))
运行结果:
ZIP 内所包含的文件列表:[‘apache-maven-3.5.2/’, ‘apache-maven-3.5.2/lib/’, ‘apache-maven-3.5.2/lib/jansi-native/’, ‘apache-maven-3.5.2/lib/jansi-native/freebsd32/’, …, ‘apache-maven-3.5.2/lib/guava-20.0.jar’]
README.txt 文件原始大小:2544 字节;压缩后大小:1107 字节,压缩后比原来小了 2.3 倍
示例计算了压缩的效率, 用压缩后文件的大小除以原来文件大小,并以 %s 字符串格式打印出来。
ZipFile 对象有一个 namelist() 方法,该方法会返回 ZIP 文件中包含的所有文件和文件夹的相对路径列表。可以把这些路径传递给 ZipFile 对象的 getinfo() 方法,它返回一个关于特定文件的 ZipInfo 对象。
ZipInfo 对象包含表示原来文件大小(file_size)和压缩后文件大小信息(compress_size ),单位为字节。
ZipFile 对象表示整个归档 ZIP 文件,而 ZipInfo 对象则表示该归档文件中的某个文件信息。
3 解压 ZIP 文件
ZipFile 对象的 extractall() 方法会从 ZIP 文件中解压缩出所包含的所有文件和文件夹,放到当前工作目录中。
import os import zipfile ''' 解压缩 ZIP 包 @author Deniro Li ''' # 改变当前工作目录到需要读取的 ZIP 包所在目录 os.chdir('F:\\temp') zip_file = zipfile.ZipFile('apache-maven-3.5.2-bin.zip') # 解压 ZIP 包到当前目录 zip_file.extractall() namelist = zip_file.namelist() print(' ZIP 内所包含的文件列表:' + str(namelist)) # 解压 ZIP 包中的某个文件,到指定目录 path = zip_file.extract('apache-maven-3.5.2/README.txt', 'F:\\temp\\2') print(path) #F:\temp\2\apache-maven-3.5.2\README.txt zip_file.close()
运行这段代码后, apache-maven-3.5.2-bin.zip 将会被解压缩到 F:\temp。 我们也可以向 extractall() 传递的一个文件夹路径,指定解压缩后的路径,默认解压到当前工作目录。如果传递给 extractall() 方法的文件夹路径不存在,zipfile 模块会创建这个路径。
利用 ZipFile 对象的 extract() 方法,可以从 ZIP 包中解压缩出单个文件。注意: 传递给 extract() 的指定文件,必须匹配 namelist() 返回的文件路径列表中的某一个。我们也可以向 extract() 传递第二个参数,将文件解压缩到指定的文件夹,默认是当前工作目录。如果传递给 extract() 方法的第二个参数(指定存放解压缩文件的文件夹路径)不存在,zipfile 模块就会创建这个路径。注意: extract() 的返回值是被解压缩出来的文件绝对路径。