Загрузка файлов из различных онлайн-ресурсов – это одна из наиболее важных и общих программистских задач, которые решаются в сети. Важность загрузки файлов можно отметить тем фактом, что огромное количество успешных приложений позволяет пользователям загружать файлы. Вот лишь немногие функции сетевых приложений, требующие загрузку файлов:
- Обмен файлами
- Сбор данных
- Отображение кода интернет-сайта (CSS, JS и так далее)
- Социальные медиа
Это лишь те из примеров, которые пришли в голову, но я уверен, что вы можете придумать их гораздо больше. В этой статье мы взглянем на некоторые наиболее популярные способы загрузить файлы в Python.
Читайте также: “Чтение и запись XML-файлов в Python”.
Оглавление
Использование модуля urllib.request
Модуль urllib.request предназначен для того, чтобы открывать или загружать файлы через HTTP. В частности, метод urlretrieve
из этого модуля поможет нам найти файл.
Чтобы применить этот метод, вам нужно передать ему два аргумента. Первый из них – это URL адрес ресурса, до которого вы хотите добраться, а второй – локальный путь, по которому вы хотите загрузить сохраняемый файл.
Давайте посмотрим на следующий пример:
import urllib.request print('Beginning file download with urllib2...') url = 'http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg' urllib.request.urlretrieve(url, '/Users/scott/Downloads/cat.jpg')
В коде, указанном выше, мы сперва импортируем модуль urllib.request
. Затем мы создаём переменную url
, которая содержит путь к загружаемому файлу. Наконец, мы вызываем метод urlretrieve
и передаём ему переменную url
в качестве первого аргумента, '/Users/scott/Downloads/cat.jpg'
как второй параметр – место назначения файла. Имейте в виду, что можно передать любое имя файла, и он будет находиться по этому пути, если у вас есть права доступа.
Запустите скрипт выше и перейдите в свою директорию ‘Downloads’. Там должен лежать файл ‘cat.jpg’. (вместо ‘scott’ следует указать имя своего домашнего каталога)
Примечание: этот модуль urllib.request.urlretrieve
объявлен устаревшим в Python3 и может быть исключён в будущем. Поэтому я рекомендовал бы использовать вместо него один из способов, о которых расскажу далее. Мы упомянули его из-за популярности в версии Python 2.
Использование модуля urllib2
Другой способ загрузить файлы в Python – через модуль urllib2. Метод urlopen
этого модуля возвращает объект, содержащий файловые данные. Прочесть содержимое
Заметьте, что в Python urllib2 объединён с urllib в виде методов urllib.request
и urllib.error
. Так что следующий код будет работать только в Python 2:
import urllib2 filedata = urllib2.urlopen('http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg') datatowrite = filedata.read() with open('/Users/scott/Downloads/cat2.jpg', 'wb') as f: f.write(datatowrite)
Метод open
принимает два параметра: путь к локальному файлу и режим, в котором будут записаны данные. Здесь 'wb'
означает, что методу open
нужно разрешение, чтобы записывать двоичные данные в указанный файл.
Запустите скрипт выше и перейдите в директорию ‘Downloads’. Вам нужно увидеть там файл ‘cat2.jpg’.
Использование модуля request
Вы также можете загружать файлы, применяя модуль requests. Входящий в него метод get
предназначен, чтобы скопировать содержимое файла в двоичном формате. Вы можете применить метод open
, чтобы открыть файл в вашей системе, как мы это делали в предыдущем методе urllib2.urlopen
.
Посмотрите на следующий скрипт:
import requests print('Beginning file download with requests') url = 'http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg' r = requests.get(url) with open('/Users/scott/Downloads/cat3.jpg', 'wb') as f: f.write(r.content) # Retrieve HTTP meta-data print(r.status_code) print(r.headers['content-type']) print(r.encoding)
В скрипте выше метод open
вновь используется, чтобы записать двоичные данные в локальный файл. Если вы запустите этот скрипт и войдёте в каталог ‘Downloads’, то обнаружите там недавно загруженный файл ‘cat3.jpg’.
С помощью модуля requests
вы также можете легко получить соответствующие метаданные о вашем запросе, включая код статуса, заголовки и многое другое. В скрипте вы можете видеть, как мы получаем доступ к этим метаданным.
То же самое происходит с дополнительными параметрами, которые требуются в HTTP запросе GET. Если вам нужно добавить отдельные заголовки, к примеру, то надо лишь создать словарь dict
с этими заголовками и передать их запросу get
:
headers = {'user-agent': 'test-app/0.0.1'} r = requests.get(url, headers=headers)
Есть тьма других опций и возможностей к этой библиотеке, так что проверьте их большой user guide, чтобы узнать больше о том, как её использовать.
Использование модуля wget
Один из простейших способов загрузить файлы в Python – через модуль wget, с которым вам не нужно открывать конечный файл. Метод download
модуля wget
загружает файлы в одну строчку. Метод принимает два параметра: URL путь к загружаемому файлу и локальный путь, где следует сохранить файл.
import wget print('Beginning file download with wget module') url = 'http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg' wget.download(url, '/Users/scott/Downloads/cat4.jpg')
Запустить скрипт выше и опять зайдите в ‘Downloads’. Здесь вы снова увидите свежезагруженный файл ‘cat4.jpg’.
Заключение
В этой статье мы представили четыре наиболее употребительных метода для загрузки файлов в Python. Лично я предпочитаю модуль request
из-за сочетания его простоты и силы. Хотя ваш проект может иметь ограничения, мешающие вам использовать сторонние библиотеки, в таком случае я бы воспользовался модулем urllib2
(для Python 2) или urllib.request
(для Python 3).
Какую библиотеку вы предпочитаете и почему? Расскажите об этом в комментариях!