4/5 - (1 голос)

Загрузка файлов из различных онлайн-ресурсов – это одна из наиболее важных и общих программистских задач, которые решаются в сети. Важность загрузки файлов можно отметить тем фактом, что огромное количество успешных приложений позволяет пользователям загружать файлы. Вот лишь немногие функции сетевых приложений, требующие загрузку файлов:

  • Обмен файлами
  • Сбор данных
  • Отображение кода интернет-сайта (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).

Какую библиотеку вы предпочитаете и почему? Расскажите об этом в комментариях!

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here