2012-07-04 54 views
0

我正在使用bz2.BZ2Decompressor類來順序解壓縮bz2壓縮數據流。我的流可能包含截斷的壓縮數據。我需要能夠區分完整文件解壓縮和只解壓部分文件的情況。有什麼辦法可以確定嗎?Python BZ2模塊順序解壓縮程序:如何找出完整文件成功解壓的時間?

爲了更詳細說明,我提供給解壓縮函數的數據流可能是也可能不是完整的bz2壓縮文件。它可能被截斷。當我使用這個函數時,它返回給我任何可以使用數據解壓的數量。它不告訴我是否已達到流尾。我如何確定相同? EOFError僅在發現後發現其他數據後纔會發生。所以這對我沒有幫助。

回答

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 
+0

雖然這會的工作,我不想這樣做。我希望有某種方式來獲得解壓縮器的當前狀態。看起來像在Python中沒有辦法得到那個。 – AnkurVj