Python 3.8 lzma解压大文件增量输入输出
Posted
技术标签:
【中文标题】Python 3.8 lzma解压大文件增量输入输出【英文标题】:Python 3.8 lzma decompress huge file incremental input and output 【发布时间】:2021-09-03 07:58:35 【问题描述】:我希望在 Python 3.8 中执行以下操作:
xz --decompress --stdout < hugefile.xz > hugefile.out
在哪里都不输入和输出都不能很好地适应内存。
当我阅读https://docs.python.org/3/library/lzma.html#lzma.LZMADecompressor 的文档时 我可以使用 LZMADecompressor 来处理增量可用的输入,我可以使用它的 decompress() 函数来增量地产生输出。
然而,LZMADecompressor 似乎将其整个解压缩输出放入单个内存缓冲区,而 decompress() 从单个输入内存缓冲区读取其整个压缩输入。
当然,文档让我对输入和/或输出何时可以增量感到困惑。
所以我想我必须生成一个单独的子进程来执行“xz”二进制文件。
有没有使用 lzma Python 模块来完成这项任务?
【问题讨论】:
除了潜在的可移植性问题(即,xz 可能未安装),我倾向于执行子进程。如果 lzma 模块有一个明确定义的流式传输机制,那很好,但情况似乎并非如此 是的,我怀疑你是对的。说得好。 【参考方案1】:不要使用低级别的LZMADecompressor
,而是使用lzma.open
来获取文件对象。然后,您可以使用shutil
模块将数据复制到另一个文件对象中:
import lzma
import shutil
with lzma.open("hugefile.xz", "rb") as fsrc:
with open("hugefile.out", "wb") as fdst:
shutil.copyfileobj(fsrc, fdst)
在内部,shutils.copyfileobj
以块的形式读取和写入数据,并且 LZMA 解压缩在运行中完成。这样可以避免将整个数据解压到内存中。
【讨论】:
以上是关于Python 3.8 lzma解压大文件增量输入输出的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用LZMA2算法压缩的文件,想从中提取某一文件时要解压(计算)完整个压缩包才能解出来?
如何使用 sharpcompress 解压 .xz (lzma2) 文件