我試圖解碼使用Python一個gzip Garmin的活動文件。根據Garmin,該文件是一個base64 gz文件。我通過上傳後從瀏覽器中的文件,並在Django應用程序接收數據。解碼的Base64 Gzip已在python
的文件的開頭是這樣的。
begin-base64 644 data.xml.gz\nH4sIAAAAAAAAA y9a4 lx3Hn d6fguB7JzNuGZkNigNfdrAGbMAYaXeNfbPolXplYiRSIFu
我用下面的代碼調整爲填充和解碼的base64:
import base64
padding_factor = (4 - len(data) % 4) % 4
data += "="*padding_factor
data_decoded = base64.b64decode(unicode(data).translate(dict(zip(map(ord, u'-_'), u'+/'))))
data_decoded的開頭是這樣的屏幕上:
\xe8"\x9f\xe6\xda\xb1\xee\xb8\xeb\x8e\x1dj\xd6\xb1\x9aX3\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03/Z\xe2\w\x1ewz~\x0b\x81\xec\x9c\xcd\xb8fd6(\r}\xda\xc0\x19\xb3\x00a\xa5\xde5\xf6\xcf\xa2U\xe9\x95\x88\x91H\x81n\xcb\xf7\xb4\x9f\xcc\xa7y%\xbd\x95\x9e\x13\xcd\x10\xf9Th\x04\x8d\xdf\xdf\xa6\xba\xa9\xcd\xf9=s\xf8G\xfc
print data_decoded
樣子這樣的:
}???a??5?ϢU鎛?H?n????̧y%?????Th??ߦ????=s?G?
然後我嘗試使用解壓文件如下:
from cStringIO import StringIO
from gzip import GzipFile
sio = StringIO(data_decoded)
gzf = gzip.GzipFile(fileobj=sio)
guff = gzf.read()
這之後,我得到以下錯誤:
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/gzip.py", line 245, in read
self._read(readsize)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/gzip.py", line 287, in _read
self._read_gzip_header()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/gzip.py", line 181, in _read_gzip_header
raise IOError, 'Not a gzipped file'
IOError: Not a gzipped file
我也試過直接在命令將文件保存到磁盤並運行gunzip解並且這也會導致相同的錯誤。
任何幫助將不勝感激。
gzip文件以字節0x1f和0x8b開頭,並且您顯示的data_decoded的開頭在開頭不包含該字符。你在那裏做了一些錯誤的事情,因爲簡單地做'\ nH4sIAAAAAAAAA y9a4 lx3Hnd6fguB7JzNuGZkNigNfdrAGbMAYaXeNfbPolXplYiRSIFu'.decode('base64')'給出了描述gzip所需的兩個初始字節。 – mmgp