我正在使用bz2.BZ2Decompressor
类来顺序解压缩bz2压缩数据流。我的流可能包含截断的压缩数据。我需要能够区分完整文件解压缩的情况和只解压缩一部分的情况。有没有办法确定?
更详细一点,我提供给解压缩功能的数据流可能是也可能不是完整的bz2压缩文件。它可能会被截断。当我使用这个函数时,它会返回给我使用数据解压缩的任何数量。它没有告诉我是否达到了流的结尾。我该如何确定?只有在找到流末尾后还有其他数据时,才会引发EOFError
。所以这对我没有帮助。
答案 0 :(得分:1)
您可以通过将一些额外的“垃圾”数据传递给解压缩程序的decompress()
方法来检测您的数据流是否完整。如果流已完成,则会引发EOFError
。如果流仍在继续,它可能不会引发异常,因为解压缩程序会认为垃圾是截断流的一部分。
以下是一些示例代码:
import bz2
def decompress(stream):
decompressor = bz2.BZ2Decompressor()
# this generator decompresses the data from the iterable stream
results = "".join(decompressor.decompress(data) for data in stream)
# now we test to see if it was a complete BZ2 stream
try:
decompressor.decompress("\0") # try adding a "junk" null character
except EOFError: # the stream was complete!
return results
except IOError: # the junk may cause an IOError if it hits a BZ2 header
pass
# if we reach this point here, the stream was incomplete
print "Incomplete stream!"
return None # you may or may not want to throw away the partial results