如果我发出文件请求并指定gzip的编码,我该如何处理?
通常,当我有一个大文件时,我会执行以下操作:
while True:
chunk = resp.read(CHUNK)
if not chunk: break
writer.write(chunk)
writer.flush()
其中CHUNK的大小以字节为单位,writer是一个open()对象,resp是从urllib请求生成的请求响应。
因此,大多数情况下,当响应标头包含' gzip'时,它非常简单。作为返回的编码,我会执行以下操作:
decomp = zlib.decompressobj(16+zlib.MAX_WBITS)
data = decomp.decompress(resp.read())
writer.write(data)
writer.flush()
或者这个:
f = gzip.GzipFile(fileobj=buf)
writer.write(f.read())
其中buf是BytesIO()。
如果我尝试解压缩gzip响应,我会遇到问题:
while True:
chunk = resp.read(CHUNK)
if not chunk: break
decomp = zlib.decompressobj(16+zlib.MAX_WBITS)
data = decomp.decompress(chunk)
writer.write(data)
writer.flush()
有没有办法可以解压缩gzip数据,因为它以小块的形式出现?或者我是否需要将整个文件写入磁盘,解压缩然后将其移动到最终文件名?我使用32位Python的部分问题是我可能会出现内存错误。
谢谢
答案 0 :(得分:2)
我想我找到了一个我希望分享的解决方案。
def _chunk(response, size=4096):
""" downloads a web response in pieces """
method = response.headers.get("content-encoding")
if method == "gzip":
d = zlib.decompressobj(16+zlib.MAX_WBITS)
b = resp.read(size)
while b:
data = d.decompress(b)
yield data
b = resp.read(size)
del data
else:
while True:
chunk = response.read(size)
if not chunk: break
yield chunk
如果有人有更好的解决方案,请添加它。基本上我的错误是创建了zlib.decompressobj()。我是在错误的地方创造的。
这似乎也适用于python 2和3,所以有一个加号。