Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг
07 Июл 2023
2 мин
845

Загрузка больших файлов в Python с помощью библиотеки Requests

Библиотека Requests для Python — это мощный инструмент для работы с HTTP-запросами. Она очень удобна в использовании и позволяет выполнять множество операций,

Библиотека Requests для Python — это мощный инструмент для работы с HTTP-запросами. Она очень удобна в использовании и позволяет выполнять множество операций, таких как отправка HTTP-запросов, обработка ответов и, что самое главное, загрузка файлов из интернета.

Однако, при загрузке больших файлов (больше 1 ГБ) могут возникнуть проблемы. Причина в том, что весь файл пытается загрузиться в оперативную память, что может привести к ее исчерпанию.

Возьмем для примера следующий код:

import requests

def download_file(url):
    local_filename = url.split('/')[-1]
    r = requests.get(url)
    f = open(local_filename, 'wb')
    for chunk in r.iter_content(chunk_size=512 * 1024): 
        if chunk: 
            f.write(chunk)
    f.close()

В этом коде используется метод iter_content(), который позволяет читать файл по частям (или «по кускам»). Размер каждого «куска» определяется параметром chunk_size, заданным в байтах. Однако, несмотря на это, весь файл все равно загружается в память перед записью на диск.

Чтобы решить эту проблему, необходимо использовать параметр stream в функции requests.get(). Параметр stream позволяет загружать файл по частям, не загружая его целиком в память. Вот как это можно сделать:

import requests

def download_file(url):
    local_filename = url.split('/')[-1]
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        with open(local_filename, 'wb') as f:
            for chunk in r.iter_content(chunk_size=8192): 
                if chunk:
                    f.write(chunk)

Теперь, при использовании этой функции, файл будет загружаться по частям размером в 8192 байта (или любой другой размер, который вы укажете). Это позволяет загружать большие файлы, не перегружая оперативную память.

Добавить комментарий