Попытка получить экспорт файла из запроса в формате zip. Я хочу скачать построчно, так как потом буду заливать в облачное хранилище и не хочу хранить весь файл в памяти.
Я попробовал следующее:
with requests.get(export_url, stream=True) as response:
for file_name, file_size, unzipped_chunks in stream_unzip(response.iter_lines()):
for chunk in unzipped_chunks:
print(chunk)
Однако я получаю следующую ошибку, которую не знаю, как решить и что это значит.
UnexpectedSignatureError: b'<htm'
«построчно» в zip-файле вряд ли сработает. Почему бы не выполнить потоковую передачу в файл (вместо того, чтобы хранить его в памяти), а затем использовать инструмент разархивирования вашей системы (например, Gunzip) через подпроцесс, чтобы ограничить использование памяти Python.
@trazoM разве не в этом вся цель библиотеки stream_unzip
? Что я могу обрабатывать фрагменты zip-файлов и разархивировать их без необходимости загружать весь файл.
@SIGHUP Мне не следует хранить какие-либо файлы в системе, поскольку она основана на модулях, которые могут использоваться другими процессами.
@Juanjo В таком случае я считаю, что твое требование невозможно выполнить.
@SIGHUP Кажется, этот ответ от trazoM работает нормально
@Juanjo В своем вопросе вы сказали, что хотите «загрузить», а затем загрузить в облачное хранилище. Насколько это решение удовлетворяет вашим требованиям? Все, что он делает, это записывает содержимое в стандартный вывод
Попробуй это:
from stream_unzip import stream_unzip
import httpx
def zipped_chunks():
# Iterable that yields the bytes of a zip file
with httpx.stream('GET', 'https://www.example.com/my.zip') as r:
yield from r.iter_bytes(chunk_size=65536)
for file_name, file_size, unzipped_chunks in stream_unzip(zipped_chunks()):
for chunk in unzipped_chunks:
print(chunk)
Отличный ответ, кажется, это работает. Однако у меня есть один вопрос: почему вы определили chunk_size в 65536? Есть ли способ узнать, какое значение мне нужно?
@Juanjo 65536 — это число или байты, которые мы хотим обработать за раз, чтобы мы не загружали/передавали все данные в память сразу. Вы можете экспериментировать с разными числами. Обычно компьютеры любят числа, являющиеся степенями 2. 65536 — это 2^16.
Вы загружаете (транслируете) zip-файл и рассматриваете его фрагменты так, как будто они тоже являются отдельными zip-файлами? Перестаньте пытаться разархивировать куски байтов.