Распаковка файла в запросе потока дает UnexpectedSignatureError

Попытка получить экспорт файла из запроса в формате 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-файл и рассматриваете его фрагменты так, как будто они тоже являются отдельными zip-файлами? Перестаньте пытаться разархивировать куски байтов.

trazoM 19.06.2024 13:42

«построчно» в zip-файле вряд ли сработает. Почему бы не выполнить потоковую передачу в файл (вместо того, чтобы хранить его в памяти), а затем использовать инструмент разархивирования вашей системы (например, Gunzip) через подпроцесс, чтобы ограничить использование памяти Python.

SIGHUP 19.06.2024 13:57

@trazoM разве не в этом вся цель библиотеки stream_unzip? Что я могу обрабатывать фрагменты zip-файлов и разархивировать их без необходимости загружать весь файл.

Juanjo 26.06.2024 09:45

@SIGHUP Мне не следует хранить какие-либо файлы в системе, поскольку она основана на модулях, которые могут использоваться другими процессами.

Juanjo 26.06.2024 09:53

@Juanjo В таком случае я считаю, что твое требование невозможно выполнить.

SIGHUP 26.06.2024 09:59

@SIGHUP Кажется, этот ответ от trazoM работает нормально

Juanjo 26.06.2024 11:36

@Juanjo В своем вопросе вы сказали, что хотите «загрузить», а затем загрузить в облачное хранилище. Насколько это решение удовлетворяет вашим требованиям? Все, что он делает, это записывает содержимое в стандартный вывод

SIGHUP 26.06.2024 11:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это:

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 26.06.2024 11:35

@Juanjo 65536 — это число или байты, которые мы хотим обработать за раз, чтобы мы не загружали/передавали все данные в память сразу. Вы можете экспериментировать с разными числами. Обычно компьютеры любят числа, являющиеся степенями 2. 65536 — это 2^16.

trazoM 26.06.2024 15:41

Другие вопросы по теме