选对压缩格式比写对代码更重要:zip适合跨平台快速打包,tar.gz兼顾通用性与压缩率,tar.xz适合高压缩归档,zstd在速度与压缩率间更平衡。
Python 中做文件压缩和解压,选对格式比写对代码更重要——不同场景下,zip、tar.gz、7z(需外部工具) 的性能差异可能达数倍。关键不在“能不能”,而在“快不快、占不占空间、跨不跨平台”。
压缩不是越高压越好,得看用途:
tarfile 模块默认不启用多线程,gzip 本身也不并行。lzma 模块),但内存占用略高。pyzstd)可启用多线程;7z 需调用命令行,灵活性高但依赖外部环境。不用装包也能高效干活,但要注意这些细节:
zipfile.ZipFile 时,指定 compression=zipfile.ZIP_DEFLATED 才真正压缩;用 ZIP_STORED 就是单纯打包,几乎零开销。tarfile.open(..., "w:gz") 内部调用 gzip.compress,无法控制压缩级别,默认是 6;想调高(如 9)需先用 gzip.GzipFile 手动封装流。shutil.copyfileobj(src, dst, length=1024*1024) 流式处理,防止 OOM。../../etc/passwd):对 ZipInfo.filename 或 TarInfo.name 做 os.path.abspath() + 路径前缀检查。拿一个含 1000 个 Python 文件(约 20MB 源码)的目录测试(i7-11800H,Python 3.11):
B)> tar.gz(6.1MB)> zstd(5.8MB)> tar.xz(5.3MB)结论:日常开发打包用 zip;CI 产物传远端用 tar.gz 或 zstd;归档历史版本优先 tar.xz;追求极致解压速度且接受稍大体积,用 zip + STORE(仅打包)。
别让压缩包在对方机器上打不开:
.tar.gz 可能双击打不开,推荐附带说明或转成 .zip;macOS 默认不带 xz,.tar.xz 需用户自行装 xz 工具。tar.gz 并确保目标环境为 Linux。