本文目录导读:

我来详细介绍Python操作ZIP压缩包的几种主要方法。
使用 zipfile 模块
zipfile 是Python内置的模块,无需额外安装。
创建ZIP压缩包
import zipfile
import os
# 创建ZIP文件并添加文件
with zipfile.ZipFile('archive.zip', 'w', zipfile.ZIP_DEFLATED) as zf:
# 添加单个文件
zf.write('file1.txt')
# 添加文件并指定在压缩包中的路径
zf.write('file2.txt', 'documents/file2.txt')
# 添加整个目录
for root, dirs, files in os.walk('my_folder'):
for file in files:
file_path = os.path.join(root, file)
# 保留目录结构
arcname = os.path.relpath(file_path, os.path.dirname('my_folder'))
zf.write(file_path, arcname)
读取ZIP压缩包
# 查看ZIP文件内容
with zipfile.ZipFile('archive.zip', 'r') as zf:
# 列出所有文件
print(zf.namelist())
# 获取文件信息
for info in zf.infolist():
print(f"文件名: {info.filename}")
print(f"原始大小: {info.file_size}")
print(f"压缩后大小: {info.compress_size}")
print("-" * 30)
解压ZIP压缩包
# 解压所有文件到指定目录
with zipfile.ZipFile('archive.zip', 'r') as zf:
zf.extractall('output_folder')
# 解压单个文件
with zipfile.ZipFile('archive.zip', 'r') as zf:
zf.extract('file1.txt', 'output_folder')
# 解压到当前目录
with zipfile.ZipFile('archive.zip', 'r') as zf:
zf.extractall()
读取压缩包内的文件内容
with zipfile.ZipFile('archive.zip', 'r') as zf:
# 读取特定文件内容
with zf.open('file1.txt') as f:
content = f.read().decode('utf-8')
print(content)
# 或使用read()方法
content = zf.read('file1.txt').decode('utf-8')
使用 shutil 模块(简化操作)
import shutil
# 压缩整个目录
shutil.make_archive('output', 'zip', 'source_folder')
# 解压ZIP文件
shutil.unpack_archive('archive.zip', 'extract_folder', 'zip')
实用示例
带密码的ZIP文件
import zipfile
# 创建加密ZIP文件
with zipfile.ZipFile('protected.zip', 'w', zipfile.ZIP_DEFLATED) as zf:
zf.setpassword(b'my_password')
zf.write('secret.txt')
# 读取加密ZIP文件
with zipfile.ZipFile('protected.zip', 'r') as zf:
zf.setpassword(b'my_password')
zf.extractall('output')
内存中的ZIP操作
import zipfile
import io
# 在内存中创建ZIP
buffer = io.BytesIO()
with zipfile.ZipFile(buffer, 'w', zipfile.ZIP_DEFLATED) as zf:
zf.writestr('hello.txt', 'Hello, World!')
zf.writestr('data.csv', 'name,age\nAlice,30\nBob,25')
# 读取内存中的ZIP
buffer.seek(0)
with zipfile.ZipFile(buffer, 'r') as zf:
print(zf.read('hello.txt').decode('utf-8'))
过滤文件进行压缩
def zip_filtered_files(filename, files_to_zip, extensions=['.txt', '.csv']):
"""只压缩指定扩展名的文件"""
with zipfile.ZipFile(filename, 'w', zipfile.ZIP_DEFLATED) as zf:
for file_path in files_to_zip:
if any(file_path.endswith(ext) for ext in extensions):
zf.write(file_path)
# 使用示例
import glob
all_files = glob.glob('*')
zip_filtered_files('filtered.zip', all_files, ['.txt', '.md'])
处理大文件(分块读取)
import zipfile
def extract_large_file(zip_path, file_name, output_path):
"""分块解压大文件"""
with zipfile.ZipFile(zip_path, 'r') as zf:
with zf.open(file_name) as source:
with open(output_path, 'wb') as target:
while True:
chunk = source.read(1024 * 1024) # 1MB chunks
if not chunk:
break
target.write(chunk)
# 使用示例
extract_large_file('large_archive.zip', 'big_file.dat', 'output.dat')
压缩模式说明
'r': 读取已存在的ZIP文件'w': 创建新ZIP文件或覆盖已存在的文件'a': 追加到已存在的ZIP文件'x': 创建新ZIP文件,如果文件已存在则报错
压缩算法
# ZIP_STORED: 不压缩,仅存储(默认)
# ZIP_DEFLATED: 使用DEFLATE算法压缩
# ZIP_BZIP2: 使用BZIP2算法压缩
# ZIP_LZMA: 使用LZMA算法压缩
with zipfile.ZipFile('compressed.zip', 'w', zipfile.ZIP_BZIP2) as zf:
zf.write('large_file.txt')
这些方法覆盖了Python操作ZIP文件的大部分场景,可以根据具体需求选择合适的方法。