zipfile 模块是 Python 标准库中用于处理 ZIP 压缩文件的模块,它提供了创建、读取、写入和修改 ZIP 文件的功能。
主要功能
- 读取 ZIP 文件内容
- 创建新的 ZIP 文件
- 向现有 ZIP 文件添加文件
- 提取 ZIP 文件内容
- 获取 ZIP 文件信息
基本用法
1. 读取 ZIP 文件
import zipfile
# 打开 ZIP 文件(只读模式)
with zipfile.ZipFile('example.zip', 'r') as zip_ref:
# 获取 ZIP 文件中所有文件和目录的列表
file_list = zip_ref.namelist()
print("ZIP 文件内容:", file_list)
# 获取文件信息
for file_info in zip_ref.infolist():
print(f"文件名: {file_info.filename}")
print(f"文件大小: {file_info.file_size} 字节")
print(f"压缩大小: {file_info.compress_size} 字节")
print(f"压缩方法: {file_info.compress_type}")
print("---")2. 提取 ZIP 文件
import zipfile
# 提取所有文件到指定目录
with zipfile.ZipFile('example.zip', 'r') as zip_ref:
zip_ref.extractall('extracted_files/')
# 提取单个文件
with zipfile.ZipFile('example.zip', 'r') as zip_ref:
zip_ref.extract('specific_file.txt', 'extracted_files/')3. 创建 ZIP 文件
import zipfile
# 创建新的 ZIP 文件并添加文件
with zipfile.ZipFile('new_archive.zip', 'w') as zip_ref:
# 添加文件到 ZIP
zip_ref.write('file1.txt')
zip_ref.write('file2.txt')
zip_ref.write('folder/file3.txt') # 可以指定路径4. 向现有 ZIP 文件添加文件
import zipfile
# 使用追加模式向现有 ZIP 文件添加文件
with zipfile.ZipFile('existing_archive.zip', 'a') as zip_ref:
zip_ref.write('new_file.txt')高级功能
1. 使用不同的压缩方法
import zipfile
# 使用不同的压缩方法
with zipfile.ZipFile('compressed.zip', 'w', zipfile.ZIP_DEFLATED) as zip_ref:
zip_ref.write('file.txt') # 使用 DEFLATE 压缩
with zipfile.ZipFile('stored.zip', 'w', zipfile.ZIP_STORED) as zip_ref:
zip_ref.write('file.txt') # 不压缩,仅存储2. 使用密码保护 ZIP 文件
import zipfile
# 创建加密的 ZIP 文件
with zipfile.ZipFile('encrypted.zip', 'w', zipfile.ZIP_DEFLATED) as zip_ref:
zip_ref.setpassword(b'my_password') # 设置密码
zip_ref.write('secret_file.txt')
# 读取加密的 ZIP 文件
with zipfile.ZipFile('encrypted.zip', 'r') as zip_ref:
zip_ref.setpassword(b'my_password') # 提供密码
zip_ref.extractall('extracted_encrypted/')3. 处理大型文件
import zipfile
# 对于大型文件,可以逐块处理
def add_large_file_to_zip(zip_filename, file_to_add, chunk_size=8192):
with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zip_ref:
with open(file_to_add, 'rb') as large_file:
# 创建 ZIP 文件中的文件条目
with zip_ref.open('large_file.bin', 'w') as zip_file:
while True:
chunk = large_file.read(chunk_size)
if not chunk:
break
zip_file.write(chunk)4. 检查 ZIP 文件完整性
import zipfile
# 测试 ZIP 文件是否完整
try:
with zipfile.ZipFile('example.zip', 'r') as zip_ref:
# 测试 ZIP 文件的完整性
bad_file = zip_ref.testzip()
if bad_file:
print(f"损坏的文件: {bad_file}")
else:
print("ZIP 文件完整")
except zipfile.BadZipFile:
print("这不是一个有效的 ZIP 文件")常用类和方法
ZipFile 类主要方法
namelist(): 返回 ZIP 文件中所有文件和目录的列表infolist(): 返回包含每个文件详细信息的 ZipInfo 对象列表getinfo(name): 返回指定文件的 ZipInfo 对象read(name): 读取指定文件的内容extract(member, path=None): 提取单个文件extractall(path=None, members=None): 提取所有文件或指定文件write(filename, arcname=None): 向 ZIP 文件添加文件close(): 关闭 ZIP 文件
ZipInfo 类属性
filename: 文件名date_time: 文件最后修改时间(元组形式)compress_type: 压缩方法file_size: 原始文件大小compress_size: 压缩后文件大小
实际应用示例
批量压缩文件夹
import zipfile
import os
def zip_directory(directory_path, zip_path):
with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zip_ref:
for root, dirs, files in os.walk(directory_path):
for file in files:
file_path = os.path.join(root, file)
# 在 ZIP 文件中创建相对路径
arcname = os.path.relpath(file_path, directory_path)
zip_ref.write(file_path, arcname)
# 使用示例
zip_directory('my_folder', 'my_folder.zip')从 ZIP 文件中搜索特定文件
import zipfile
def search_in_zip(zip_path, search_term):
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
matching_files = []
for file_name in zip_ref.namelist():
if search_term.lower() in file_name.lower():
matching_files.append(file_name)
return matching_files
# 使用示例
results = search_in_zip('archive.zip', '.txt')
print("找到的文本文件:", results)注意事项
- 文件路径: 在 Windows 系统上,路径分隔符会被自动转换为正斜杠(/)
- 编码: 对于非 ASCII 文件名,可能需要指定编码
- 大文件: 处理大文件时注意内存使用
- 安全性: 提取 ZIP 文件时注意路径遍历攻击
zipfile 模块是处理 ZIP 文件的强大工具,适用于各种压缩和解压缩需求。
















