2017-03-04 45 views
0

我想在下載過程中解壓縮一個非常大的.gz文件(commoncrawl網頁提取),但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,你需要火起來爲每個新decompressobj,使用unused_data您從最後一個注意開始下一個。

+0

「當你從解壓縮對象中獲得eof」你能更加明確嗎? outstr [-1] == b'?' – JulienFr

+1

'd.eof'是真的。 –