Если я сделаю запрос на файл и укажу кодировку 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, заключается в том, что я могу избавиться от ошибок памяти.
Спасибо