2017-03-04 13 views
0

다운로드하는 동안 매우 큰 .gz 파일 (commoncrawl 웹 압축 풀기)을 압축하려고하지만 zlib이 첫 번째 파일 (파일이 많은 것으로 보입니다. 연결된 gz 파일).여러 파일 .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 | .... 

답변

1

당신은 꽤 많이 자신의 질문에 대한 답을 주었다. gzip 스트림 (gzip 스트림 자체)이 연결되어 있으므로 압축 해제 객체에서 eof을 얻으면 마지막에 기록한 unused_data을 사용하여 각각에 대해 새로운 decompressobj을 실행해야합니다. 다음 것을 시작하십시오.

+0

"압축 해제 개체에서 eof를 가져올 때"보다 명확하게 나타낼 수 있습니까? outstr [-1] == b '?' – JulienFr

+1

'd.eof'가 참입니다. –