我正在尝试在下载过程中解压缩非常大的.gz文件(commoncrawl Web提取),但是zlib在第一个文件(该文件似乎是许多串联的gz文件)之后停止。
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 | ....
最佳答案
您几乎给了自己的问题答案。您正在处理gzip流的串联(其本身是有效的gzip流),因此当您从解压缩对象获得eof
时,需要使用decompressobj
为每个对象触发一个新的unused_data
。从上一个开始记下,开始下一个。
关于python - 如何使用python逐块解压缩多个文件.gz,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42602122/