Python LZMA 尝试解压缩时数据损坏错误

问题描述

response = requests.get('http://content.warframe.com/PublicExport/index_en.txt.lzma')
data = lzma.decompress(response.content)

我得到的错误是:

_lzma.LZMAError: Corrupt input data

我不认为数据已损坏,因为我可以从浏览器下载它并使用 7zip 将其解压缩。我试图在网上找到解决方案,但似乎没有很多关于这个问题的信息。我也尝试过使用不同的解压缩方式,但没有运气。 (Python LZMA : Compressed data ended before the end-of-stream marker was reached)

编辑:这是当前“有效”的解决方案。差不多,切掉结尾并忽略 EOF 错误

def fix():
    response = requests.get('http://content.warframe.com/PublicExport/index_en.txt.lzma')
    data = response.content
    byt = bytes(data)
    length = len(data)
    stay = True
    while stay:
        stay = False
        try:
            decompress_lzma(byt[0:length])
        except LZMAError:
            length -= 1
            stay = True

    print(decompress_lzma(byt[0:length]))

# FROM: https://stackoverflow.com/a/37400585/15041587
def decompress_lzma(data):
    results = []
    while True:
        decomp = LZMADecompressor(FORMAT_AUTO,None,None)
        try:
            res = decomp.decompress(data)
        except LZMAError:
            if results:
                break  # Leftover data is not a valid LZMA/XZ stream; ignore it.
            else:
                raise  # Error on the first iteration; bail out.
        results.append(res)
        data = decomp.unused_data
        if not data:
            break
        if not decomp.eof:
            raise LZMAError("Compressed data ended before the end-of-stream marker was reached")
    return b"".join(results)

解决方法

我还可以使用 7zip 打开文件。但是在尝试使用 xz 解压缩上面链接的文件并看到

$ xz --format=lzma --decompress -t index_en.txt.lzma
xz: index_en.txt.lzma: Compressed data is corrupt

我不完全确定,但我怀疑文件实际上可能以某种方式损坏或不标准,即 7zip 能够成功解压缩此文件的方式不是常态.

为了进一步支持这一点,如果我通过 xz 创建一个新的 LZMA 文件,例如

xz --format=lzma --compress -k <file>

并尝试在 Python 中使用 lzma.open() 解压缩和读取该文件,它可以正常工作。