zstandard(zstd)在python中需安装第三方库zstandard,无内置支持;压缩须用zstdcompressor流式处理大文件,避免oom;解压需用stream_reader应对多帧或不完整流。

zstandard(zstd)在Python里不是靠内置模块,必须装第三方库 zstandard,否则连 import zstandard 都会报 ModuleNotFoundError。
安装与基础压缩:别用 gzip 的思维调 zstd
Python 标准库不带 zstd,得 pip 装:pip install zstandard。压缩逻辑和 gzip 完全不同——它不提供类似 gzip.compress() 那种“一函数搞定”的便捷接口,而是分三步:创建压缩器、获取写入器、流式写入。
- 直接传 bytes 给
ZstdCompressor().compress()是可以的,但只适合小数据;大文件必须用compressor.stream_writer()+.write()流式处理,否则内存爆掉 - 压缩级别默认是 3,想更快就设
level=1,想更小就设level=19(但 19 比 3 慢 5 倍以上) - 别手动加
.zst后缀再用open(..., 'wb')写——zstd 不是归档格式,它只负责压缩字节流,文件后缀纯属约定
压缩大文件时必须用流式写入,否则 OOM
读一个 2GB 文件再一次性 compress(),Python 进程大概率被系统 kill。正确做法是边读边压,控制内存驻留量。
- 用
open(input_path, 'rb')读原始文件,每次.read(8192)或更大块(如64*1024) - 压缩器对象复用:
compressor = zstandard.ZstdCompressor(level=3),然后with compressor.stream_writer(output_file) as writer: -
writer.write(chunk)每次写入一块,底层自动缓冲并输出压缩帧;with语句结束时自动 flush 尾部帧 - 错误示范:
writer.write(file.read())—— 这又把整个文件读进内存了
解压时注意输入流是否完整,ZstdDecompressor.decompress() 不吃不完整帧
如果压缩时用了流式写入,解压也得用流式读取。直接 decompress() 整个文件内容,只有在确认该文件是单帧(比如用 compress() 一次性压的)时才安全。
- 遇到
zstandard.ZstdError: Error 10 : Unknown frame descriptor,基本是输入数据被截断或混入了非 zstd 字节 - 稳妥解法:
decompressor = zstandard.ZstdDecompressor(),然后decompressor.stream_reader(input_file)包一层,再用shutil.copyfileobj()或循环.read(8192) - 若原始压缩用了多帧(比如多个
writer.write()调用),解压器能自动识别帧边界,无需额外拆分
zstd 的快,本质来自它的多阶段编码器和默认启用的多线程(ZstdCompressor(threads=-1) 会用满 CPU 核数),但这也意味着你得主动管理输入/输出流边界——它不像 gzip 那样“假装自己是个文件”,它就是个字节转换器。漏 flush、混用同步/异步 IO、或者把网络传输中半截的压缩流当完整帧解压,都是高频翻车点。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











