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算法压缩的文件,想从中提取某一文件时要解压(计算)完整个压缩包才能解出来?

lzma解压

如何使用 sharpcompress 解压 .xz (lzma2) 文件

第八周总结

Unity LZMA GZIP 压缩解压文件 和 打包文件夹 (支持进度回调)

重新创建的 LZMA 在 332 字节后与原始 LZMA 不同 - 可能吗?