0

我正在尝试使用以下代码片段解压缩 bz2 文件,该代码片段在各个地方提供:

bz2_data = bz2.BZ2File(DATA_FILE+".bz2").read()
open(DATA_FILE, 'wb').write(bz2_data)

但是,我得到的文件比我预期的要小得多。

当我使用 7z GUI 提取文件时,我收到一个大小为 248MB 的文件。但是,使用上面的代码,我得到的文件是 879kb。

当我阅读提取的 XML 文件时,我可以看到文件的其余部分已按预期丢失。

我在 Windows 机器上运行 anaconda,据了解bz2在文件实际结束之前达到 EOF。

顺便说一句,我已经遇到了这个两个都没有好处。

4

2 回答 2

1

如果这是一个多流文件,那么 Python 的bz2模块(3.3 之前)不支持它:

注意 此类不支持包含多个流的输入文件(例如由 pbzip2 工具生成的流)。读取这样的输入文件时,只能访问第一个流。如果您需要支持多流文件,请考虑使用第三方 bz2file 模块(可从 PyPI 获得)。这个模块提供了 Python 3.3 的 BZ2File 类的反向移植,它确实支持多流文件。

另一种替代方法:bz2file应该可以工作。

于 2017-08-21T17:57:37.970 回答
0

如果它是一个多流文件,您必须设置mode为,"r"否则它将静默失败(例如,按原样输出压缩数据)。

这应该做你想要的:

with open(out_file_path) as out_file, BZ2File(bz2_file_path, "r") as bz2_file:
        for data in iter(lambda: bz2_file.read(100 * 1024), b""):
            out_file.write(data)

从文档中:

如果 mode 为 'r',则输入文件可能是多个压缩流的串联。

https://docs.python.org/3/library/bz2.html#bz2.BZ2File

于 2021-10-21T05:46:52.577 回答