Язык программирования Python
Язык программирования Python читать книгу онлайн
Курс посвящен одному из бурно развивающихся и популярных в настоящее время сценарных языков программирования — Python. Язык Python позволяет быстро создавать как прототипы программных систем, так и сами программные системы, помогает в интеграции программного обеспечения для решения производственных задач. Python имеет богатую стандартную библиотеку и большое количество модулей расширения практически для всех нужд отрасли информационных технологий. Благодаря ясному синтаксису изучение языка не составляет большой проблемы. Написанные на нем программы получаются структурированными по форме, и в них легко проследить логику работы. На примере языка Python рассматриваются такие важные понятия как: объектно–ориентированное программирование, функциональное программирование, событийно–управляемые программы (GUI–приложения), форматы представления данных (Unicode, XML и т.п.). Возможность диалогового режима работы интерпретатора Python позволяет существенно сократить время изучения самого языка и перейти к решению задач в соответствующих предметных областях. Python свободно доступен для многих платформ, а написанные на нем программы обычно переносимы между платформами без изменений. Это обстоятельство позволяет применять для изучения языка любую имеющуюся аппаратную платформу.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Листинг
import urllib
data = {«search»: «Python»}
enc_data = urllib.urlencode(data)
# метод GET
f = urllib.urlopen(«http://searchengine.com/search» + "?» + enc_data)
print f.read()
# метод POST
f = urllib.urlopen(«http://searchengine.com/search», enc_data)
print f.read()
В некоторых случаях данные имеют повторяющиеся имена. В этом случае в качестве параметра urllib.urlencode() можно использовать вместо словаря последовательность пар имя–значение:
Листинг
>>> import urllib
>>> data = [(«n», «1»), («n», «3»), («n», «4»), («button», «Привет»),]
>>> enc_data = urllib.urlencode(data)
>>> print enc_data
n=1&n=3&n=4&button=%F0%D2%C9%D7%C5%D4
Модуль urllib позволяет загружать web–объекты через прокси–сервер. Если ничего не указывать, будет использоваться прокси–сервер, который был задан принятым в конкретной ОС способом. В Unix прокси–серверы задаются в переменных окружения http_proxy, ftp_proxy и т.п., в Windows прокси–серверы записаны в реестре, а в Mac OS они берутся из конфигурации Internet. Задать прокси–сервер можно и как именованный параметр proxies к urllib.urlopen():
Листинг
# Использовать указанный прокси
proxies = {'http': 'http://www.proxy.com:3128'}
f = urllib.urlopen(some_url, proxies=proxies)
# Не использовать прокси
f = urllib.urlopen(some_url, proxies={})
# Использовать прокси по умолчанию
f = urllib.urlopen(some_url, proxies=None)
f = urllib.urlopen(some_url)
Функция urlretrieve() позволяет записать заданный URL сетевой объект в файл. Она имеет следующие параметры:
Листинг
urllib.urlretrieve(url[, filename[, reporthook[, data]]])
Здесь url — URL сетевого объекта, filename — имя локального файла для помещения объекта, reporthook — функция, которая будет вызываться для сообщения о состоянии загрузки, data — данные для метода POST (если он используется). Функция возвращает кортеж (filepath, headers) , где filepath — имя локального файла, в который закачан объект, headers — результат метода info() для объекта, возвращенного urlopen().
Для обеспечения интерактивности функция urllib.urlretrieve() вызывает время от времени функцию, заданную в reporthook(). Этой функции передаются три аргумента: количество принятых блоков, размер блока и общий размер принимаемого объекта в байтах (если он неизвестен, этот параметр равен–1).
В следующем примере программа принимает большой файл и, чтобы пользователь не скучал, пишет процент от выполненной загрузки и предполагаемое оставшееся время:
Листинг
FILE = 'boost–1.31.0–9.src.rpm'
URL = 'http://download.fedora.redhat.com/pub/fedora/linux/core/3/SRPMS/' + FILE
def download(url, file):
import urllib, time
start_t = time.time()
def progress(bl, blsize, size):
dldsize = min(bl*blsize, size)
if size != -1:
p = float(dldsize) / size
try:
elapsed = time.time() - start_t
est_t = elapsed / p — elapsed
except:
est_t = 0
print "%6.2f %% %6.0f s %6.0f s %6i / %-6i bytes» % (
p*100, elapsed, est_t, dldsize, size)
else:
print "%6i / %-6i bytes» % (dldsize, size)
urllib.urlretrieve(URL, FILE, progress)
download(URL, FILE)
Эта программа выведет примерно следующее (процент от полного объема закачки, прошедшие секунды, предполагаемое оставшееся время, закачанные байты, полное количество байтов):
Листинг
0.00 % 1 s 0 s 0 / 6952309 bytes
0.12 % 5 s 3941 s 8192 / 6952309 bytes
0.24 % 7 s 3132 s 16384 / 6952309 bytes
0.35 % 10 s 2864 s 24576 / 6952309 bytes
0.47 % 12 s 2631 s 32768 / 6952309 bytes
0.59 % 15 s 2570 s 40960 / 6952309 bytes
0.71 % 18 s 2526 s 49152 / 6952309 bytes
0.82 % 20 s 2441 s 57344 / 6952309 bytes
…
Функции для анализа URL
Согласно документу RFC 2396 URL должен строиться по следующему шаблону:
Листинг
scheme://netloc/path;parameters?query#fragment
где
Листинг
scheme
Адресная схема. Например: http, ftp, gopher.
Листинг
netloc
Местонахождение в сети.
Листинг
path
Путь к ресурсу.
Листинг
params
Параметры.
Листинг
query
Строка запроса.
Листинг
frag
Идентификатор фрагмента.
Одна из функций уже использовалась для формирования URL — urllib.urlencode(). Кроме нее в модуле urllib имеются и другие функции:
Листинг
quote(s, safe='/')
Функция экранирует символы в URL, чтобы их можно было отправлять на web–сервер. Она предназначена для экранирования пути к ресурсу, поэтому оставляет '/' как есть. Например:
Листинг
>>> urllib.quote(«[email protected]»)
'rnd%40onego.ru'
>>> urllib.quote(«a = b + c»)
'a%20%3D%20b%20%2B%20c'
>>> urllib.quote(«0/1/1»)
'0/1/1'
>>> urllib.quote(«0/1/1», safe="")
'0%2F1%2F1'
quote_plus(s, safe='')
Функция экранирует некоторые символы в URL (в строке запроса), чтобы их можно было отправлять на web–сервер. Аналогична quote(), но заменяет пробелы на плюсы.
Листинг
unquote(s)
Преобразование, обратное quote_plus(). Пример:
Листинг
>>> urllib.unquote('a%20%3D%20b%20%2B%20c')
'a = b + c'
unquote_plus(s)
Преобразование, обратное quote_plus(). Пример:
Листинг
>>> urllib.unquote_plus('a+=+b+%2B+c')
'a = b + c'
Для анализа URL можно использовать функции из модуля urlparse:
Листинг
urlparse(url, scheme='', allow_fragments=1)
Разбирает URL в 6 компонентов (сохраняя экранирование символов): scheme://netloc/path;params?query#frag
Листинг
urlsplit(url, scheme='', allow_fragments=1)
Разбирает URL в 6 компонентов (сохраняя экранирование символов): scheme://netloc/path?query#frag
Листинг
urlunparse((scheme, netloc, url, params, query, fragment))
Собирает URL из 6 компонентов.
Листинг
urlunsplit((scheme, netloc, url, query, fragment))
Собирает URL из 5 компонентов.
Пример:
Листинг
>>> from urlparse import urlsplit, urlunsplit
>>> URL = «http://google.com/search?q=Python»
>>> print urlsplit(URL)
('http', 'google.com', '/search', 'q=Python', '')
>>> print urlunsplit(
… ('http', 'google.com', '/search', 'q=Python', ''))
http://google.com/search?q=Python
Еще одна функция того же модуля urlparse позволяет корректно соединить две части URL — базовую и относительную:
Листинг
>>> import urlparse
>>> urlparse.urljoin('http://python.onego.ru', 'itertools.html')
'http://python.onego.ru/itertools.html'
Возможности urllib2
Функциональности модулей urllib и urlparse хватает для большинства задач, которые решают сценарии на Python как web–клиенты. Тем не менее, иногда требуется больше. На этот случай можно использовать модуль для работы с протоколом HTTP — httplib — и создать собственный класс для HTTP–запросов (в лекциях модуль httplib не рассматривается). Однако вполне вероятно, что нужная функциональность уже имеется в модуле urllib2.
Одна из полезных возможностей этих модулей — доступ к web–объектам, требующий авторизации. Ниже будет рассмотрен пример, который не только обеспечит доступ с авторизацией, но и обозначит основную идею модуля urllib2: использование обработчиков (handlers), каждый из которых решает узкую специфическую задачу.
Следующий пример показывает, как создать собственный открыватель URL с помощью модуля urllib2 (этот пример взят из документации по Python):