Warning: ftp_fget() expects parameter 1 to be resource, null given in /www/wwwroot/new.weijing.co/wp-admin/includes/class-wp-filesystem-ftpext.php on line 146

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

发表评论

您的电子邮箱地址不会被公开。

Shopping Cart