簡體   English   中英

在Python中解壓縮.bz2文件

[英]Decompressing a .bz2 file in Python

所以,這是一個看似簡單的問題,但我顯然非常沉悶。 我有一個小腳本從網頁下載所有.bz2文件,但由於某種原因,該文件的解壓縮讓我頭疼。

我是一個Python新手,所以答案可能很明顯,請幫助我。

在腳本的這一部分,我已經有了這個文件,我只是想把它讀出來變量,然后解壓縮? 那正確嗎? 我已經嘗試了各種方法來做到這一點,我通常在這個片段的最后一行得到“ValueError:找不到流的結尾”錯誤。 我試圖打開zipfile並以無數種方式將其寫入字符串。 這是最新的。

openZip = open(zipFile, "r")
s = ''
while True:
    newLine = openZip.readline()
    if(len(newLine)==0):
       break
    s+=newLine
    print s                   
    uncompressedData = bz2.decompress(s)

嗨Alex,我應該列出我嘗試過的所有其他方法,因為我嘗試過read()方式。

方法A:

print 'decompressing ' + filename

fileHandle = open(zipFile)
uncompressedData = ''

while True:            
    s = fileHandle.read(1024)
    if not s:
        break
        print('RAW "%s"', s)
        uncompressedData += bz2.decompress(s)

        uncompressedData += bz2.flush()

        newFile = open(steamTF2mapdir + filename.split(".bz2")[0],"w")
        newFile.write(uncompressedData)
        newFile.close()   

我收到錯誤:

uncompressedData += bz2.decompress(s)
ValueError: couldn't find end of stream

方法B.

zipFile = steamTF2mapdir + filename
print 'decompressing ' + filename
fileHandle = open(zipFile)

s = fileHandle.read()
uncompressedData = bz2.decompress(s)

同樣的錯誤:

uncompressedData = bz2.decompress(s)
ValueError: couldn't find end of stream

非常感謝您的及時回復。 我真的把頭靠在牆上,因為無法解壓縮簡單的.bz2文件而感覺非常厚。

通過by,使用7zip手動解壓縮,以確保文件沒有任何問題,並且解壓縮得很好。

您正在打開並讀取壓縮文件,就像它是由行組成的文本文件一樣。 別! 不是。

uncompressedData = bz2.BZ2File(zipFile).read()

似乎更接近你正在尋找的東西。

編輯 :OP已經展示了他嘗試過的一些東西(盡管我沒有看到任何關於嘗試過最佳方法的注釋 - 我上面推薦的單線程!)但是它們似乎都有一個共同的錯誤,並且我重復上面的關鍵位:

打開...壓縮文件,好像它是一個文本文件......它不是。

open(filename)甚至更明確的open(filename, 'r')打開,用於讀取, 文本文件 - 壓縮文件是二進制文件,因此為了正確讀取它必須用open(filename, 'rb')打開它open(filename, 'rb') ((我推薦bz2.BZ2File知道它正在處理一個壓縮文件,當然,所以沒有必要再告訴它))。

在Python 2.* ,在Unix-y系統上(即除了Windows之外的每個系統),你都可以放棄使用open (但是在Python 3.*你不能,因為文本是Unicode,而二進制是字節) - 不同種類)。

在Windows中(以及在DOS之前),由於歷史原因,因為Windows的文本文件是區別的,所以它總是必不可少的(使用兩個字節而不是一個到結束行,並且至少在某些情況下,需要一個字節值'\\0x1A'表示文件的邏輯結尾)因此讀寫低級代碼必須進行補償。

所以我懷疑OP正在使用Windows並且正在為不小心使用'rb'選項(“讀取二進制”)來支付open內置的價格。 (盡管bz2.BZ2File仍然比較簡單,無論你使用什么平台! - )。

openZip = open(zipFile,“r”)

如果你在Windows上運行,你可能想在這里說openZip = open(zipFile,“rb”) ,因為該文件可能包含CR / LF組合,並且你不希望它們被翻譯。

newLine = openZip.readline()

正如亞力克指出的那樣,這是非常錯誤的,因為“線”的概念對壓縮流來說是陌生的。

s = fileHandle.read(1024)[...] uncompressedData + = bz2.decompress(s)

出於同樣的原因,這是錯誤的。 1024字節的塊不太可能對解壓縮器有多大意義,因為它會想要使用它自己的塊大小。

s = fileHandle.read()uncompressedData = bz2.decompress(s)

如果這不起作用,我會說這是我上面提到的新線翻譯問題。

這非常有幫助。 在Windows打開時,2300個文件中的44個文件丟失了文件。 添加b(inary)標志以打開修復問題。

for line in bz2.BZ2File(filename, 'rb', 10000000) :

效果很好。 (10M是緩沖大小,適用於涉及的大文件)

謝謝!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM