0
私はgzippedファイルを持っていて、それを別のgzipファイルと連結すると、Pythonで別々にファイルを読むことができますか?Pythonの連結gzipから複数のファイルを読む
例:
cat f1.csv.gz f2.csv.gz > f3.csv.gzip
私は、これは行くには可能である知っているが、Pythonでこれを行う方法はありますか?
私はgzippedファイルを持っていて、それを別のgzipファイルと連結すると、Pythonで別々にファイルを読むことができますか?Pythonの連結gzipから複数のファイルを読む
例:
cat f1.csv.gz f2.csv.gz > f3.csv.gzip
私は、これは行くには可能である知っているが、Pythonでこれを行う方法はありますか?
はい。 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
:
これは、各連結のgzipコンポーネントの非圧縮サイズを出力します!しかし、私はそれには微妙なバグが含まれていると思います:いくつかの小さなファイルが1つの8Kブロック内で圧縮されている場合はどうですか?このコードはループのたびに最初のものを解凍します。本当ですか? –
いいえ、バッファサイズは関係ありません。 20バイトのgzipストリームが8192バイトの先頭にある場合、残りの8172バイトは 'z.unused_data'に残されます。あなたはそれを試して、それが動作することを見ることができます。 –
あなたはそうです、私はより密接に見て、実際には、単一のブロック内の複数のファイルを解凍します。 –