Python requests: скачать большой файл потоково
При скачивании большого файла установите stream=True и записывайте ответ частями через iter_content. Тогда файл не загружается целиком в оперативную память приложения. ????? ??????????? ?????????? ???????? ?????? ??????? ? ????????? ?????? ? ??????? ?????.
Рабочий пример
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. Их пропускают; размер блока задаёт верхнюю границу буфера, а не гарантированный размер каждого чтения.