2015-10-03 158 views
2

我試圖使用Python解壓縮* .Z文件。我通過FTP(二進制模式)下載它。該文件使用7zip(文件中的「信息」表示它是「Z」類型)成功解壓縮。原始文件可在ftp://cddis.gsfc.nasa.gov/gps/products/1860/igr18600.sp3.Z找到。使用Python解壓縮.Z文件

我就用在Python zlib的模塊念起來有我使用了一些測試代碼:

import zlib 

comp_data = open('C:\Temp\igr18600.sp3.Z', 'rb').read() 

print(comp_data[0:10]) 

uncomp_data = zlib.decompress(comp_data) 
with open('c:\temp\igr18600.sp3', 'wb') as f: 
    f.write(uncomp_data) 
    f.close() 

當我執行此我得到以下輸出:

b'\x1f\x9d\x90#\[email protected]\x91\x01#F' 
Traceback (most recent call last): 
    File "test.py", line 7, in <module> 
    uncomp_data = zlib.decompress(comp_data) 
zlib.error: Error -3 while decompressing data: incorrect header check 

zlib顯然不喜歡標題。第一對字節似乎與壓縮文件的適當幻數序列0x1F9d相匹配(每https://en.wikipedia.org/wiki/List_of_file_signatures)。

在一個捏我可以解決這個通過炮擊到7zip直接。但我希望找到一種純Python類型的答案。儘管花了大部分時間用Google搜索答案(或者這個錯誤信息),但我沒有多少運氣。也許我的搜索技能是萎縮?

+0

該鏈接還提到了'7-Zip文件格式'爲'37 7A BC AF 27 1C'。 –

回答

1

Python在模塊中沒有Unix解壓縮的等效功能,這就是解壓縮.Z文件所需要的。你可能需要a)shell到Unix壓縮命令,b)shell到gzip,c)shell到7-zip(gzip和7-zip都能夠解壓縮.Z文件),d)修改C中的原始解壓縮代碼並將其鏈接到Python(該代碼可在線獲得),或者e)在本機Python中編寫您自己的LZW解壓縮程序。

對於d),你可以找到我寫的一些C代碼來完成這項工作in this answer on mathematica.stackexchange.com。請參閱unlzw()函數。

+1

謝謝馬克。感謝您在zlib上的所有努力。很高興聽到我沒有失去明顯的東西。我現在就掏出7-zip,並開始調查d和e以獲得我自己的啓發。 –

+3

我用選項e去了。謝謝你的幫助,馬克。 https://github.com/umeat/unlzw – unclemeat

+0

@unclemeat,感謝您處理純Python的實現。我也會爲您的應用程序嘗試一下。 –