Python 3.8使用lzma模块增量解压超大文件 实现xz命令等效功能
结论
可以直接使用Python标准库的lzma模块实现需求,无需调用外部xz二进制文件,也不会将整个文件加载到内存中。
实现方案
方案1:使用lzma.open(最简写法)
lzma.open默认封装了流式处理逻辑,你只需要按固定块大小读写即可,内存占用仅和你设置的块大小有关,和源文件总大小无关:
import lzma # 可根据实际情况调整块大小,推荐1~4MB即可 CHUNK_SIZE = 1 * 1024 * 1024 with lzma.open("hugefile.xz", "rb") as f_in, open("hugefile.out", "wb") as f_out: while chunk := f_in.read(CHUNK_SIZE): f_out.write(chunk)
方案2:手动使用LZMADecompressor(可控性更高)
你之前对LZMADecompressor的理解存在偏差:它并不会将所有解压结果累积在内存中,内部仅保留解压必要的状态数据,每次调用decompress传入一块压缩数据,只会返回当前块可解压出的未压缩数据,完全支持增量处理:
import lzma CHUNK_SIZE = 1 * 1024 * 1024 decompressor = lzma.LZMADecompressor() with open("hugefile.xz", "rb") as f_in, open("hugefile.out", "wb") as f_out: while chunk := f_in.read(CHUNK_SIZE): uncompressed_data = decompressor.decompress(chunk) f_out.write(uncompressed_data) # 处理最后残留的缓冲数据 if not decompressor.eof: uncompressed_data = decompressor.flush() f_out.write(uncompressed_data)
两种方案都可以稳定处理体积超过内存容量的大文件,和你给出的xz命令效果完全等效。
内容的提问来源于stack exchange,提问作者ThePythonicCow
相关产品推荐
相关产品推荐

