Python 文件压缩与解压技术
1. ZIP 文件压缩操作
1.1 基础压缩功能
import zipfile
# 创建压缩文件
with zipfile.ZipFile('test.zip', 'w') as zipf:
zipf.write('file1.txt')
zipf.write('file2.txt')
1.2 追加压缩文件
with zipfile.ZipFile('test.zip', 'a') as zipf:
zipf.write('file3.txt')
1.3 压缩文件过滤
def filter_files(files):
return [f for f in files if not f.endswith('.tmp')]
1.4 路径拼接处理
import os
def get_full_path(base_dir, filename):
return os.path.join(base_dir, filename)
2. TAR 文件压缩操作
2.1 基础压缩功能
import tarfile
with tarfile.open('test.tar', 'w') as tar:
tar.add('file1.txt')
tar.add('file2.txt')
2.2 自定义文件名
with tarfile.open('test.tar', 'w') as tar:
tar.add('file1.txt', arcname='new_name.txt')
2.3 压缩文件过滤
def filter_files(files):
return [f for f in files if not f.startswith('.')]
3. 解压操作指南
3.1 ZIP 文件解压
with zipfile.ZipFile('test.zip', 'r') as zipf:
zipf.extractall()
3.2 TAR 文件解压
with tarfile.open('test.tar', 'r') as tar:
tar.extractall()
3.3 解压时的文件名处理
def extract_with_renamer(tar, member):
new_name = f"renamed_{member.name}"
tar.extract(member, path='extracted_folder')
4. 高级操作技巧
4.1 压缩目录处理
import os
def compress_directory(zip_path, dir_path):
with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
for root, dirs, files in os.walk(dir_path):
for file in files:
file_path = os.path.join(root, file)
arcname = os.path.relpath(file_path, start=dir_path)
zipf.write(file_path, arcname=arcname)
4.2 压缩文件大小限制
def compress_with_size_limit(zip_path, file_path, max_size=1024*1024):
if os.path.getsize(file_path) > max_size:
raise ValueError("文件大小超过限制")
with zipfile.ZipFile(zip_path, 'w') as zipf:
zipf.write(file_path)
5. 常见问题处理
5.1 压缩文件损坏
- 检查文件路径是否正确
- 确认写入权限
- 使用
ZIP_DEFLATED压缩方式
5.2 解压失败处理
- 确认文件完整性
- 检查文件名编码
- 使用
extractall()方法
5.3 路径冲突处理
def safe_extract(tar, path='extracted'):
os.makedirs(path, exist_ok=True)
tar.extractall(path=path)
6. 其他压缩格式
6.1 RAR 格式
# 需要安装 rarfile 库
import rarfile
with rarfile.RarFile('test.rar', 'w') as rarf:
rarf.add('file1.txt')
rarf.add('file2.txt')
6.2 7z 格式
# 需要安装 py7zr 库
import py7zr
with py7zr.SevenZipFile('test.7z', 'w') as sevenz:
sevenz.write('file1.txt')
sevenz.write('file2.txt')
7. 最佳实践建议
- 路径处理:始终使用
os.path模块处理文件路径 - 异常处理:添加try-except块处理文件操作异常
- 编码设置:使用
encoding='utf-8'参数处理非ASCII文件名 - 压缩级别:根据需求选择压缩级别(ZIP_DEFLATED, ZIP_BZIP2等)
- 文件过滤:使用过滤器排除临时文件和隐藏文件
8. 性能优化技巧
8.1 批量处理
def batch_compress(zip_path, files):
with zipfile.ZipFile(zip_path, 'w') as zipf:
for file in files:
zipf.write(file)
8.2 并行处理
from concurrent.futures import ThreadPoolExecutor
def parallel_compress(zip_paths, files_list):
with ThreadPoolExecutor() as executor:
futures = [executor.submit(compress_files, zip_path, files)
for zip_path, files in zip_paths]
8.3 内存优化
def compress_large_file(zip_path, file_path):
with open(file_path, 'rb') as f_in:
with zipfile.ZipFile(zip_path, 'a', zipfile.ZIP_DEFLATED) as zipf:
zipf.writestr(os.path.basename(file_path), f_in.read())
9. 常见错误排查
| 错误类型 | 解决方案 |
|---|---|
PermissionError | 检查文件写入权限 |
FileNotFoundError | 确认文件路径正确 |
NotADirectoryError | 确认压缩对象是文件而非目录 |
OSError | 检查磁盘空间和文件系统状态 |
10. 相关库说明
| 格式 | 库名称 | 特点 |
|---|---|---|
| ZIP | zipfile | Python标准库 |
| TAR | tarfile | Python标准库 |
| RAR | rarfile | 需要额外安装 |
| 7z | py7zr | 需要额外安装 |
| GZIP | gzip | Python标准库 |
注意:所有压缩操作建议在操作前备份重要数据,特别是在处理大文件或敏感信息时。对于生产环境,建议使用更安全的压缩方式并实施访问控制。
视频学习来源:https://www.bilibili.com/video/BV1YB4y1t7Gm/?p=41
2113

被折叠的 条评论
为什么被折叠?



