Python Package:zipfile
Posted on Wed, 25 Dec 2024 16:12:58 +0800 by LiangMingJian
概述
标准库
zipfile 是 Python 中用于读写 zip 文件的一个模块,其通过构建 zipfile 实例对象完成对文件的操作,支持创建,读取,写入,添加等功能。
需要注意,当前该模块不能处理分卷压缩的 ZIP 文件,同时也不建议处理加密后的 ZIP 文件(处理很慢),当然,也不能创建一个加密的 ZIP 文件。
压缩文件
通过构建 ZipFile 对象,并通过 write() 方法添加文件进行压缩。
class zipfile.ZipFile() 支持参数包括:
file:必填,传入一个文件路径或文件对象。mode:对象的操作模式,与文件一样,支持读r,写w,追加a,仅新建x。compression:使用的 ZIP 压缩方法,支持的压缩方法包括:ZIP_STORED(仅归档不不压缩),ZIP_DEFLATED(使用 zlib 模块压缩),ZIP_BZIP2(使用 bz2 模块压缩)或ZIP_LZMA(使用 lzma 模块压缩)(如果确实模块,则压缩失败)。allowZip64:当 zipfile 大于 4 GiB 时,将创建使用 ZIP64 扩展的 ZIP 文件。compresslevel:压缩等级,0-9。strict_timestamps:禁止压缩早于 1980-01-01 的文件( ZIP 文件的时间戳存储采用 MS-DOS 格式,仅支持 1980 年(MS-DOS 的发布时间)之后的时间)。metadata_encoding:元数据编码格式,如:UTF-8。
import zipfile
# 新建一个压缩文件
with zipfile.ZipFile('example.zip', 'w') as myzip:
myzip.write('requirements.txt')
# 仅新建一个压缩文件(如果文件已存在则会报错)
with zipfile.ZipFile('example.zip', 'x') as myzip:
myzip.write('requirements.txt')
# 报错:FileExistsError: [Errno 17] File exists: 'example.zip'
# 添加文件到一个已有压缩文件
with zipfile.ZipFile('example.zip', 'a') as myzip:
myzip.write('my.xls')
压缩目录
当需要压缩一个文件夹时,开发者要结合 os.walk() 递归目标目录下所有的内容,然后将这些内容全部写入到压缩文件中。
需要注意,在添加文件时要保留目录下所有文件的路径结构,不然压缩包里面的文件夹会错乱。
import os
import zipfile
target_path = 'example/'
with zipfile.ZipFile('example.zip', 'w') as myzip:
for folder_path, folder_names, file_names in os.walk(target_path):
for file in file_names:
file_path = os.path.join(folder_path, file)
arcname = os.path.relpath(file_path, target_path)
myzip.write(file_path, arcname)
# myzip.write(文件路径,归档名称),归档名称可选
解压 ZIP 文件
通过 extract() 可以单独从压缩包中提取一个文件,通过 extractall() 可以解压所有文件。
import zipfile
# 解压相对压缩包路径为 exp/null.py 的文件到当前文件夹
with zipfile.ZipFile('example.zip', 'r') as myzip:
myzip.extract('exp/null.py', './')
# 解压压缩包内 base.py, tp.js 这两个文件到当前文件夹
with zipfile.ZipFile('example.zip', 'r') as myzip:
myzip.extractall('./', ['base.py', 'tp.js'])
# 解压压缩包内所有文件到当前文件夹
with zipfile.ZipFile('example.zip', 'r') as myzip:
myzip.extractall('./')
查看 ZIP 文件
import zipfile
with zipfile.ZipFile('example.zip', 'r') as myzip:
# 将压缩包的目录信息打印到控制台
myzip.printdir()
# 返回压缩包内所有文件名称列表
print(myzip.namelist())
# 返回压缩包内所有文件的 ZipInfo 对象
print(myzip.infolist())
# 返回压缩包内某个文件的 ZipInfo 对象并查看相关信息
iinfo = myzip.getinfo('base.py')
print(info.is_dir()) # 是不是文件夹
print(info.filename) # 文件名
print(info.date_time) # 创建时间
print(info.file_size) # 未压缩前的大小
print(info.compress_size) # 压缩后的大小
————————————