Python中如何实现ZIP文件有效压缩?使用zipfile和shutil无压缩效果怎么办
Python生成ZIP压缩包无明显压缩效果的解决方法
首先明确前提:如果待压缩的文件本身是已经经过高压缩处理的格式(如JPG/PNG图片、MP4/MP3音视频、RAR/7Z压缩包、加密PDF文档等),任何ZIP压缩算法都不会带来明显的体积下降,甚至可能因为增加了ZIP文件头信息导致体积略涨,这种情况不存在优化空间。
如果待压缩的是可压缩格式(如纯文本、代码、未压缩的办公文档等),可以通过以下方式优化压缩效果:
- 调整压缩级别
Python的zipfile默认使用的压缩等级为6(等级范围0~9,0为无压缩,9为最高压缩比),你可以手动指定compresslevel=9获取最高压缩率:
zipfile修改示例:
shutil.make_archive修改示例(Python3.7及以上版本支持):with zipfile.ZipFile(f'{directory_name}.zip', 'w', zipfile.ZIP_DEFLATED, compresslevel=9) as zipf:shutil.make_archive(directory_path, 'zip', directory_path, compresslevel=9) - 补全完整的文件写入逻辑
你贴出的zipfile代码仅包含压缩包初始化部分,需要确认你后续有完整遍历目标目录下的所有文件并写入压缩包,避免漏加文件导致压缩比异常,完整实现参考:import os import zipfile def compress_dir(source_dir, output_zip): with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED, compresslevel=9) as zipf: for root, _, files in os.walk(source_dir): for file in files: full_path = os.path.join(root, file) # 保持压缩包内的相对目录结构,避免生成绝对路径层级 arc_path = os.path.relpath(full_path, os.path.dirname(source_dir)) zipf.write(full_path, arcname=arc_path) - 更换更高压缩比的算法
如果兼容问题可以接受,可以选择ZIP支持的BZIP2或LZMA算法,相比默认的DEFLATED算法压缩率更高,仅需修改压缩方法参数即可:
BZIP2算法示例:
LZMA算法示例:with zipfile.ZipFile(f'{directory_name}.zip', 'w', zipfile.ZIP_BZIP2, compresslevel=9) as zipf:
注意:这两种算法压缩耗时更长,且部分低版本解压工具可能不支持with zipfile.ZipFile(f'{directory_name}.zip', 'w', zipfile.ZIP_LZMA, compresslevel=9) as zipf:
内容的提问来源于stack exchange,提问作者Shagun Chawla
相关产品推荐
相关产品推荐

