Python LZMA:压缩数据在到达流结束标记之前结束
Python LZMA : Compressed data ended before the end-of-stream marker was reached
我正在使用内置的 lzma python 来解码压缩的数据块。根据数据块,我得到以下异常:
Compressed data ended before the end-of-stream marker was reached
数据未损坏。用其他工具可以正确解压,所以一定是库的bug。还有其他人遇到同样的问题:
- http://bugs.python.org/issue21872
- https://github.com/peterjc/backports.lzma/issues/6
- Downloading large file in python error: Compressed file ended before the end-of-stream marker was reached
不幸的是,none 似乎还没有找到解决办法。至少,一个适用于 Python 3.5.
的
我该如何解决这个问题?有什么解决办法吗?
我花了很多时间试图理解和解决这个问题,所以我认为分享它是个好主意。问题似乎是由没有正确设置 EOF 字节的数据块引起的。为了解压缩缓冲区,我曾经使用 lzma python 库提供的 lzma.decompress
。但是,此方法要求每个数据缓冲区都包含一个 EOF 字节,否则会抛出 LZMAError
异常。
为了解决这个限制,我们可以实现一个替代解压缩函数,它使用 LZMADecompress
对象从缓冲区中提取数据。例如:
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)
该功能与标准lzma lib提供的功能类似,只有一键不同。如果整个缓冲区已被处理,循环就会中断,before 检查我们是否到达了 EOF 标记。
我希望这对其他人有用。
我正在使用内置的 lzma python 来解码压缩的数据块。根据数据块,我得到以下异常:
Compressed data ended before the end-of-stream marker was reached
数据未损坏。用其他工具可以正确解压,所以一定是库的bug。还有其他人遇到同样的问题:
- http://bugs.python.org/issue21872
- https://github.com/peterjc/backports.lzma/issues/6
- Downloading large file in python error: Compressed file ended before the end-of-stream marker was reached
不幸的是,none 似乎还没有找到解决办法。至少,一个适用于 Python 3.5.
的我该如何解决这个问题?有什么解决办法吗?
我花了很多时间试图理解和解决这个问题,所以我认为分享它是个好主意。问题似乎是由没有正确设置 EOF 字节的数据块引起的。为了解压缩缓冲区,我曾经使用 lzma python 库提供的 lzma.decompress
。但是,此方法要求每个数据缓冲区都包含一个 EOF 字节,否则会抛出 LZMAError
异常。
为了解决这个限制,我们可以实现一个替代解压缩函数,它使用 LZMADecompress
对象从缓冲区中提取数据。例如:
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)
该功能与标准lzma lib提供的功能类似,只有一键不同。如果整个缓冲区已被处理,循环就会中断,before 检查我们是否到达了 EOF 标记。
我希望这对其他人有用。