Язык программирования Python
Язык программирования Python читать книгу онлайн
Курс посвящен одному из бурно развивающихся и популярных в настоящее время сценарных языков программирования — Python. Язык Python позволяет быстро создавать как прототипы программных систем, так и сами программные системы, помогает в интеграции программного обеспечения для решения производственных задач. Python имеет богатую стандартную библиотеку и большое количество модулей расширения практически для всех нужд отрасли информационных технологий. Благодаря ясному синтаксису изучение языка не составляет большой проблемы. Написанные на нем программы получаются структурированными по форме, и в них легко проследить логику работы. На примере языка Python рассматриваются такие важные понятия как: объектно–ориентированное программирование, функциональное программирование, событийно–управляемые программы (GUI–приложения), форматы представления данных (Unicode, XML и т.п.). Возможность диалогового режима работы интерпретатора Python позволяет существенно сократить время изучения самого языка и перейти к решению задач в соответствующих предметных областях. Python свободно доступен для многих платформ, а написанные на нем программы обычно переносимы между платформами без изменений. Это обстоятельство позволяет применять для изучения языка любую имеющуюся аппаратную платформу.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
(8.12.11/8.12.11) with SMTP id i817UtUN026093;ntWed, 1 Sep 2004
11:30:58 +0400']
Стоит заметить, что в электронном письме может быть несколько полей с именем received (в этом примере их два).
Некоторые важные данные можно получить в готовом виде, например, тип содержимого, кодировку:
Листинг
>>> msg.get_content_type()
'text/plain'
>>> print msg.get_main_type(), msg.get_subtype()
text plain
>>> print msg.get_charset()
None
>>> print msg.get_params()
[('text/plain', ''), ('charset', 'us–ascii')]
>>> msg.is_multipart()
False
или список полей:
Листинг
>>> print msg.keys()
['Received', 'Received', 'Message–ID', 'Date', 'From', 'User–Agent',
'MIME–Version', 'To', 'Subject', 'Content–Type',
'Content–Transfer–Encoding', 'Spam', 'X–Spam']
Так как сообщение состоит из одной части, можно получить его тело в виде строки:
Листинг
>>> print msg.get_payload()
sorgeloosheid hullw ifesh nozama decompresssequenceframes
Believe it or not, I have tried several sites to b»_«uy presription
medication. I should say that currently you are still be the best amony
…
Теперь будет рассмотрен другой пример, в котором сообщение состоит из нескольких частей. Это сообщение порождено вирусом. Оно состоит из двух частей: HTML–текста и вложенного файла с расширением cpl. Для доступа к частям сообщения используется метод walk(), который обходит все его части. Попутно следует собрать типы содержимого (в списке parts), поля Content–Type (в ct_fields) и имена файлов (в filenames):
Листинг
import email
parts = []
ct_fields = []
filenames = []
f = open(«virus.eml»)
msg = email.message_from_file(f)
for submsg in msg.walk():
parts.append(submsg.get_content_type())
ct_fields.append(submsg.get('Content–Type', ''))
filenames.append(submsg.get_filename())
if submsg.get_filename():
print «Длина файла:", len(submsg.get_payload())
f.close()
print parts
print ct_fields
print filenames
В результате получилось:
Листинг
Длина файла: 31173
['multipart/mixed', 'text/html', 'application/octet–stream']
['multipart/mixed;n boundary=" — — — — hidejpxkblmvuwfplzue»',
'text/html; charset=«us–ascii»',
'application/octet–stream; name=«price.cpl»']
[None, None, 'price.cpl']
Из списка parts можно увидеть, что само сообщение имеет тип multipart/mixed, тогда как две его части — text/html и application/octet–stream соответственно. Только с последней частью связано имя файла (price.cpl). Файл читается методом get_payload() и вычисляется его длина.
Кстати, в случае, когда сообщение является контейнером для других частей, get_payload() выдает список объектов–сообщений (то есть экземпляров класса Message).
Формирование сообщения
Часто возникает ситуация, когда нужно сформировать сообщение с вложенным файлом. В следующем примере строится сообщение с текстом и вложением. В качестве класса для порождения сообщения можно использовать не только Message из модуля email.Message, но и MIMEMultipart из email.MIMEMultipart (для сообщений из нескольких частей), MIMEImage (для сообщения с графическим изображением), MIMEAudio (для аудиофайлов), MIMEText (для текстовых частей):
Листинг
# Загружаются необходимые модули и функции из модулей
from email.Header import make_header as mkh
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEBase import MIMEBase
from email.Encoders import encode_base64
# Создается главное сообщение и задаются некоторые поля
msg = MIMEMultipart()
msg[«Subject»] = mkh([(«Привет», «koi8–r»)])
msg[«From»] = mkh([(«Друг», «koi8–r»), ("<[email protected]>", «us–ascii»)])
msg[«To»] = mkh([(«Друг2», «koi8–r»), ("<[email protected]>", «us–ascii»)])
# То, чего будет не видно, если почтовая программа поддерживает MIME
msg.preamble = «Multipart message»
msg.epilogue = ""
# Текстовая часть сообщения
text = u»"«К письму приложен файл с архивом.»"".encode(«koi8–r»)
to_attach = MIMEText(text, _charset=«koi8–r»)
msg.attach(to_attach)
# Прикладывается файл
fp = open(«archive_file.zip», «rb»)
to_attach = MIMEBase(«application», «octet–stream»)
to_attach.set_payload(fp.read())
encode_base64(to_attach)
to_attach.add_header(«Content–Disposition», «attachment»,
filename=«archive_file.zip»)
fp.close()
msg.attach(to_attach)
print msg.as_string()
В этом примере видно сразу несколько модулей пакета email. Функция make_header() из email.Header позволяет закодировать содержимое для заголовка:
Листинг
>>> from email.Header import make_header
>>> print make_header([(«Друг», «koi8–r»), ("<[email protected]>", «us–ascii»)])
=?koi8–r?b?5NLVxw==?= <[email protected]>
>>> print make_header([(u»Друг», ""), ("<[email protected]>", «us–ascii»)])
=?utf–8?b?w6TDksOVw4c=?= <[email protected]>
Функция email.Encoders.encode_base64() воздействует на переданное ей сообщение и кодирует тело с помощью base64. Другие варианты: encode_quopri() - кодировать quoted printable, encode_7or8bit() - оставить семь или восемь бит. Эти функции добавляют необходимые поля.
Аргументы конструкторов классов из MIME–модулей пакета email:
Листинг
class MIMEBase(_maintype, _subtype, **_params)
Базовый класс для всех использующих MIME сообщений (подклассов Message). Тип содержимого задается через _maintype и _subtype.
Листинг
class MIMENonMultipart()
Подкласс для MIMEBase, в котором запрещен метод attach(), отчего он гарантированно состоит из одной части.
Листинг
class MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]])
Подкласс для MIMEBase, который является базовым для MIME–сообщений из нескольких частей. Главный тип multipart, подтип указывается с помощью _subtype.
Листинг
class MIMEAudio(_audiodata[, _subtype[, _encoder[, **_params]]])
Подкласс MIMENonMultipart. Используется для создания MIME–сообщений, содержащих аудио данные. Главный тип — audio, подтип указывается с помощью _subtype. Данные задаются параметром _audiodata.
Листинг
class MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]])
Подкласс MIMENonMultipart. Используется для создания MIME–сообщений с графическим изображением. Главный тип — image, подтип указывается с помощью _subtype. Данные задаются параметром _imagedata.
Листинг
class MIMEMessage(_msg[, _subtype])
Подкласс MIMENonMultipart для класса MIMENonMultipart используется для создания MIME–объектов с главным типом message. Параметр _msg применяется в качестве тела и должен являться экземпляром класса Message или его потомков. Подтип задается с помощью _subtype, по умолчанию 'rfc822'.
Листинг
class MIMEText(_text[, _subtype[, _charset]])
Подкласс MIMENonMultipart. Используется для создания MIME–сообщений текстового типа. Главный тип — text, подтип указывается с помощью _subtype. Данные задаются параметром _text. Посредством _charset можно указать кодировку (по умолчанию 'us–ascii').
Разбор поля заголовка
В примере выше поле Subject формировалось с помощью email.Header.make_header(). Разбор поля поможет провести другая функция: email.Header.decode_header(). Эта функция возвращает список кортежей, в каждом из них указан кусочек текста поля и кодировка, в которой этот текст был задан. Следующий пример поможет понять суть дела: