使用 Python 创建、读取或解压 ZIP 文件

带有 .zip 扩展名的文件,是一个包含许多文件或文件夹的压缩包。因为压缩之后,不仅会减少一个文件的大小,还可以把需要传输的文件数降到最低(1 个),这样很适合网络传输。压缩包也称为归档包。

利用 zipfile 模块中的函数, 我们就可以创建或解压 ZIP 文件。

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() 的返回值是被解压缩出来的文件绝对路径。

发表评论