用 zipfile 模块压缩文件
你可能熟悉 ZIP 文件(带有 .zip 文件扩展名),它可以包含许多其他文件的压缩内容。压缩一个文件会减少它的大小,这在因特网上传输时很有用。因为一个 ZIP 文件可以包含多个文件和子文件夹,所以它是一种很方便的方式,将多个文件打包成一个文件。
利用 zipfile 模块中的函数,Python 程序可以创建和打开(或解压)ZIP 文件。
创建 ZIP 文件
要创建你自己的压缩 ZIP 文件,必须以“写模式”打开 ZipFile 对象,即传入 'w' 作为第二个参数(这类似于向 open() 函数传入 'w' ,以写模式打开一个文本文件)。
如果向 ZipFile 对象的 write() 方法传入一个路径,Python 就会压缩该路径所指的文件,将它加到 ZIP 文件中。
- write() 方法的第一个参数是一个字符串,代表要添加的文件名。
- 第二个参数是“压缩类型”参数,它告诉计算机使用怎样的算法来压缩文件。可以总是将这个值设置为
zipfile.ZIP_DEFLATED
(这指定了 deflate 压缩算法,它对各种类型的数据都很有效)。
import zipfile
"""创建压缩包"""
file_list = ['01 文件与文件路径.py', '02 绝对路径与相对路径.py', '03 文件夹操作.py']
with zipfile.ZipFile('自动化办公课件.zip', 'w') as zip_obj:
for file in file_list:
zip_obj.write(file)
# 向已有的压缩包内添加内容
# zip_obj.write(待添加的文件名)
with zipfile.ZipFile('自动化办公课件.zip', 'a') as zip_obj:
zip_obj.write('04 路径处理.py')
这段代码将创建一个新的 ZIP 文件,名为 自动化办公课件.zip,它包含了几个压缩后的文件。
要记住,就像写入文件一样,写模式将擦除 ZIP 文件中所有原有的内容。如果只是希望将文件添加到原有的 ZIP 文件中,就要向 zipfile.ZipFile() 传入 'a' 作为第二个参数,以添加模式打开 ZIP 文件。
读取 ZIP 文件
要读取 ZIP 文件的内容,首先必须创建一个 ZipFile 对象(请注意大写首字母 Z 和 F)。ZipFile 对象在概念上与 File 对象相似。 要创建一个 ZipFile 对象,就调用 zipfile.ZipFile() 函数,向它传入一个字符串,表示 .zip 文件的文件名。
请注意,zipfile 是 Python 模块的名称,ZipFile() 是函数的名称。
例如,输入以下代码:
import zipfile
"""读取压缩包信息"""
with zipfile.ZipFile('自动化办公课件.zip', 'r') as zip_obj:
# print(zip_obj.namelist())
for filename in zip_obj.namelist():
# 中文有时候会乱码
# print(filename.encode('cp437').decode('gbk'))
# print(filename)
"""获取详细信息
.file_size 是原始文件大小
.compress_size 是压缩后大小
输出结果单位是字节
"""
info = zip_obj.getinfo(filename)
print(filename, info.file_size, info.compress_size)
ZipFile 对象有一个 namelist() 方法,返回 ZIP 文件中包含的所有文件和文件夹的字符串的列表。这些字符串可以传递给 ZipFile 对象的 getinfo() 方法,返回一个关于特定文件的 ZipInfo 对象。ZipInfo 对象有自己的属性,诸如表示字节数的 file_size
和 compress_size
,它们分别表示原来文件大小和压缩后文件大小。ZipFile 对象表示整个归档文件,而 ZipInfo 对象则保存该归档文件中每个文件的有用信息。
解压缩
ZipFile 对象的 extractall() 方法从 ZIP 文件中解压缩所有文件和文件夹,放到当前工作目录中。
import zipfile
"""解压操作"""
with zipfile.ZipFile('自动化办公课件.zip', 'r') as zip_obj:
""" 解压单个文件
zipobj.extract(压缩包内要解压的文件名)
zipobj.extract(压缩包内要解压的文件名,解压到哪个位置)
中文乱码,重新调整编码
for filename in zipobj.namelist():
current_path = filename.encode('cp437').decode('gbk')
建议路径下中文文件和文件夹不要出现中文
如果有中文的可以先获取正确的编码文字,再重命名
"""
zip_obj.extract('07 glob.py')
with zipfile.ZipFile('自动化办公课件.zip', 'r') as zip_obj:
""" 解压多个文件
.extractall(path=解压到哪个位置)
.extractall(path=解压到哪个位置,pwd=b'密码')
"""
zip_obj.extractall(path='./02-文件与目录')