2016-05-04 14 views
0

私はgzippedファイルを持っていて、それを別のgzipファイルと連結すると、Pythonで別々にファイルを読むことができますか?Pythonの連結gzipから複数のファイルを読む

例:

cat f1.csv.gz f2.csv.gz > f3.csv.gzip

私は、これは行くには可能である知っているが、Pythonでこれを行う方法はありますか?

答えて

0

はい。 z = zlib.decompressobj(31)を使用して、z.unused_dataが空でないか、すべての入力を処理するまで、zを使用して解凍してください。 z.unused_dataが空でない場合は、次のgzipストリームの開始点が入ります。新しいy = zlib.decompressobjオブジェクトを作成し、内容をz.unused_dataにして圧縮解除を開始し、ファイルからさらにデータを取得します。おかげで - 私はこの答えは非常に役に立った

#!/usr/bin/python 
import sys 
import zlib 
z = zlib.decompressobj(31) 
count = 0 
while True: 
    if z.unused_data == "": 
     buf = sys.stdin.read(8192) 
     if buf == "": 
      break 
    else: 
     print count 
     count = 0 
     buf = z.unused_data 
     z = zlib.decompressobj(31) 
    got = z.decompress(buf) 
    count += len(got) 
print count 
+0

これは、各連結のgzipコンポーネントの非圧縮サイズを出力します!しかし、私はそれには微妙なバグが含まれていると思います:いくつかの小さなファイルが1つの8Kブロック内で圧縮されている場合はどうですか?このコードはループのたびに最初のものを解凍します。本当ですか? –

+0

いいえ、バッファサイズは関係ありません。 20バイトのgzipストリームが8192バイトの先頭にある場合、残りの8172バイトは 'z.unused_data'に残されます。あなたはそれを試して、それが動作することを見ることができます。 –

+0

あなたはそうです、私はより密接に見て、実際には、単一のブロック内の複数のファイルを解凍します。 –

関連する問題