2017-03-04 8 views
0

ダウンロード中に非常に大きな.gzファイル(commoncrawl web extract)を解凍しようとしていますが、zlibは最初のファイルの後で停止しています連結されたgzファイル)。複数のファイル.gzチャンクをPythonでチャンクで解凍する方法

import requests,json,zlib 
fn="crawl-data/CC-MAIN-2017-04/segments/1484560279933.49/warc/CC-MAIN-20170116095119-00381-ip-10-171-10-70.ec2.internal.warc.gz" 
fn="https://commoncrawl.s3.amazonaws.com/"+fn 
r = requests.get(fn, stream=True) 
d = zlib.decompressobj(zlib.MAX_WBITS | 16) 
for chunk in r.iter_content(chunk_size=2048): 
    if chunk: 
     outstr = d.decompress(chunk) 
     print(len(chunk),chunk[:10].hex(),len(outstr),len(d.unused_data)) 

すべてのチャンクは「unused_data」に移動し、最初のものだけが解凍されません。

ZCATへの配管とき、それは素晴らしい作品:

curl https://commoncrawl.s3... | zcat | .... 

答えて

1

あなたはかなりあなた自身の質問に答えを与えました。 gzipストリーム(それ自体は有効なgzipストリーム)の連結を扱っているので、解凍オブジェクトからeofを取得したときは、最後に書き留めたunused_dataを使用して、それぞれdecompressobjを起動する必要があります次のものを開始してください。

+0

「解凍オブジェクトからeofを取得すると、より明示的になりますか? outstr [-1] == b '?' – JulienFr

+1

'd.eof'が真です。 –

関連する問題