Python requests: скачать большой файл потоково

Категория: Python · Язык: Python · Обновлено:

При скачивании большого файла установите stream=True и записывайте ответ частями через iter_content. Тогда файл не загружается целиком в оперативную память приложения. ????? ??????????? ?????????? ???????? ?????? ??????? ? ????????? ?????? ? ??????? ?????.

Рабочий пример

Python
import requests

url = "https://files.example.test/archive.zip"
with requests.get(url, stream=True, timeout=(5, 60)) as response:
    response.raise_for_status()
    with open("archive.zip.part", "wb") as output:
        for chunk in response.iter_content(chunk_size=1024 * 1024):
            if chunk:
                output.write(chunk)

Промежуточное расширение .part помогает отличить незавершённую загрузку. После успешного закрытия файла переименуйте его в целевой путь через os.replace; не публикуйте файл до полной загрузки.

Частый вопрос

Почему iter_content иногда возвращает пустой chunk?

Пустые chunks возможны при декодировании transfer encoding. Их пропускают; размер блока задаёт верхнюю границу буфера, а не гарантированный размер каждого чтения.