Python解压缩时出现LZMA损坏数据错误

4
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: 压缩数据在到达流结束标记之前就已经结束
编辑:这是目前“可行”的解决方案。基本上,删除末尾并忽略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://dev59.com/spffa4cB1Zd3GeqP6Vb0#37400585
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)
1个回答

1

我也能用7zip打开这个文件。但是在试图用xz解压上面链接的文件后,发现

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

我不完全确定,但我怀疑该文件可能存在损坏或非标准化的情况。也就是说,7zip能够成功解压缩此文件的方式并不是常规方式。
为了进一步支持这一点,如果我通过创建一个新的LZMA文件,例如:
xz --format=lzma --compress -k <file>

尝试在Python中使用lzma.open()解压并读取该文件,它可以正常工作,没有任何问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接