2012-02-04 14 views
2

私はgzipped文字列を持っています、それは別のアプリケーションから格納されて作成されます。これで文字列(MIMEタイプもヘッダーも付いていません)があるので、私はそれを解凍する必要があります。ヘッダーやMIMEタイプのないGzip文字列を読み取る方法は?

Pythonでこれを行う方法はありますか?

[編集]私は文字通り私はファイルタイプとMIMEタイプを想定して見たIDLE

他の例に文字列自体を貼り付け、次いでコピーメモ帳に文字列を貼り付け、次いで.gzとして私もテストした改名テストします私が持っているものはすべて大きな文字列です。 ]

バイトをbase64でデコードする必要があります。

使用zlib.decompress(mystring)は@reclosedevでコメントを確認し、いくつかのより多くの追加のエラーにError -3 while decompressing data: incorrect header check

+0

メモ帳があなたの文字列を壊す可能性があります。どこかに元のファイルをアップロードできますか? – reclosedev

+0

リンクは次のとおりです:https://www.yousendit.com/download/T2djWGJORkVmVGJsZThUQwこれは2つのレコードを持つcsvファイルです。各レコードは文字列です。 gzip文字列の前にある配列は無視してもかまいません(無関係な次元データです) –

+0

あなたの文字列はBase64でエンコードされていますか?このレコードはどのような種類のデータ(テキスト、バイナリ)ですか? – reclosedev

答えて

1

を与えます。

この結果、の伸長された長さを構成する4バイトが、32ビットのリトルエンディアンの2進数であるデータである。残りの部分はRFC-1952に準拠したgzipストリームで、1F 8B 08で始まると認識されます。解凍結果はバイナリデータのように見えますが、ASCII 1と0の文字列ではありません。私はちょうど上記にこれを追加必要な1と0を取得するには

をコメントに応答して

unknown: '2a\x00\x00' 
unknown as 32-bit LE int: 24882 
24882 bytes in decompressed data 
first 100: '\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00 
\x00\x00\x00' 

unknown: 'nH\x00\x00' 
unknown as 32-bit LE int: 18542 
18542 bytes in decompressed data 
first 100: '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff 
\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 
\x00\x00\x00\x00\x07\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80 
\x00\x00\x00' 

更新

コード:

lines = [ 
    # extracted from the linked csv file 
    "[133,120,696,286]MmEAAB+LCAAAAAAABADtvQdg [BIG snip] a0bokyYQAA", 
    "[73,65,564,263]bkgAAB+LCAAAAAAABADtvQdgHE [BIG snip] kgAAA==", 
    ] 
import zlib, struct 
for line in lines: 
    print 
    b64 = line.split(']')[1] 
    raw = b64.decode('base64') 
    print "unknown:", repr(raw[:4]) 
    print "unknown as 32-bit LE int:", struct.unpack("<I", raw[:4])[0] 
    ungz = zlib.decompress(raw[4:], 31) 
    print len(ungz), "bytes in decompressed data" 
    print "first 100:", repr(ungz[:100]) 

出力
cleaned = bin(int(binascii.hexlify(ungz) 、16))

"Just"?あなたは、より良い方法で、正面から'0b'を取り除き、その後、長さ8.例の複数を作るために必要な数の先行ゼロとパッドフロントをする必要があります:

>>> import binascii 
>>> ungz = '\x01\x80' 
>>> bin(int(binascii.hexlify(ungz), 16)) 
'0b110000000' 
>>> ''.join('{0:08b}'.format(ord(x)) for x in ungz) 
'0000000110000000' 

あなたは慎重に点検しましたあなたが本当に'0000000110000000'を望んでおり、'1000000000000001'ではないことを確認しますか?

+0

うわー、ありがとう@JohnMachinと@reclosedev。これは実際には完全に機能します。 1秒と0秒を取得するには、私は上記の 'cleaned = bin(int(binascii.hexlify(ungz)、16))'に ' –

+0

@ user1043502を追加しました。 –

+0

ありがとう、あなたは正しい私はいくつかの先頭の0を欠いている。私は月曜日までそれを残すつもりでしたが、あなたの追加された反応は私がどこに向かうよりもずっと良かったです。別のテスト例を実行してパッドする必要がありましたが、手動でテストして他のすべてが正しく動作していることをテストしました。あなたは私の最初の質問にもっと徹底的に答えました。私が望んでいたことです、ありがとうございました! –

関連する問題