悠悠楠杉
Python文件压缩实战:zipfile模块完全指南
一、为什么需要掌握文件压缩?
在日常开发中,我们经常需要处理文件打包和压缩的场景:日志归档、附件批量下载、分布式文件传输等。Python内置的zipfile模块无需第三方依赖,支持:
- 创建加密压缩包(AES加密)
- 按需添加/删除文件
- 内存压缩(不落盘操作)
- 跨平台兼容性
二、zipfile核心操作详解
1. 基础压缩示例
python
import zipfile
创建压缩包('w'写入模式,'a'追加模式)
with zipfile.ZipFile('archive.zip', 'w') as zipf:
# 添加单个文件
zipf.write('document.txt', arcname='docs/note.txt') # 重命名并指定目录
# 添加整个目录
import os
for root, dirs, files in os.walk('reports'):
for file in files:
path = os.path.join(root, file)
zipf.write(path, os.path.relpath(path, 'reports'))
2. 高级功能实现
密码保护(Python 3.6+)
python
with zipfile.ZipFile('secure.zip', 'w', compression=zipfile.ZIP_DEFLATED) as zipf:
zipf.setpassword(b'secret123')
zipf.write('confidential.pdf')
内存压缩(不生成实体文件)
python
from io import BytesIO
buffer = BytesIO()
with zipfile.ZipFile(buffer, 'w') as zipf:
zipf.writestr('in_memory.txt', 'This content stays in RAM')
获取压缩后的二进制数据
compressed_data = buffer.getvalue()
三、性能优化技巧
- 压缩级别选择:python
设置压缩级别(0-9)
zipf = zipfile.ZipFile('opt.zip', 'w', compresslevel=6)
- 增量更新:python
检查文件是否已存在
if 'updated.txt' not in zipf.namelist():
zipf.write('updated.txt')
- 大文件分卷压缩:python
需要结合第三方库如 patool
import patoolib
patoolib.create('hugedata.7z', ['largefile.bin'], program='7zip')
四、实际应用场景
案例:自动化日志归档系统
python
import datetime
import zipfile
import glob
def archivelogs(): today = datetime.date.today() zipname = f"logs_{today.strftime('%Y%m')}.zip"
with zipfile.ZipFile(zip_name, 'a') as zipf:
for log_file in glob.glob('*.log'):
# 跳过已压缩文件
if log_file not in zipf.namelist():
zipf.write(log_file)
print(f"Added {log_file}")
print(f"Total files: {len(zipf.namelist())}")
每月执行一次
archive_logs()
五、注意事项
路径处理建议:
- 使用
os.path
处理跨平台路径 - 避免在压缩包中使用绝对路径
- 使用
安全风险:
- 解压前检查文件路径防止目录穿越攻击
- 密码保护不适用于ZIP64格式
常见异常处理:
python try: with zipfile.ZipFile('corrupt.zip') as zipf: zipf.testzip() except zipfile.BadZipFile: print("压缩包已损坏!")
六、扩展学习
对于更复杂的压缩需求,可以考虑:
- pyzipper
:支持AES加密增强版
- rarfile
:处理RAR格式
- lzma
:LZMA算法高压缩比