Соответствующий пример дан ниже. В файле pr.csv
имена полей заданы в первой строке файла, поэтому можно не задавать fieldnames
:
import csv
input_file = open("pr.csv", "rb")
rdr = csv.DictReader(input_file,
fieldnames=['name', 'number', 'text'])
output_file = open("pr1.csv", "wb")
wrtr = csv.DictWriter(output_file,
fieldnames=['name', 'number', 'text'])
for rec in rdr:
try:
rec['number'] = int(rec['number']) + 1
except:
pass
wrtr.writerow(rec)
input_file.close()
output_file.close()
Модуль имеет также другие классы и функции, которые можно изучить по документации. На примере этого модуля можно увидеть общий подход к работе с файлом в некотором формате. Следует обратить внимание на следующие моменты:
• Модули для работы с форматами данных обычно содержат функции или конструкторы классов, в частности Reader
и Writer
.
• Эти функции и конструкторы возвращают объекты–итераторы для чтения данных из файла и объекты со специальными методами для записи в файл.
• Для разных нужд обычно требуется иметь несколько вариантов классов читающих и пишущих объектов. Новые классы могут получаться наследованием от базовых классов либо обертыванием функций, предоставляемых модулем расширения (написанным на C). В приведенном примере DictReader
и DictWriter
являются обертками для функций reader()
и writer()
и объектов, которые они порождают.
Пакет email
Модули пакета email
помогут разобрать, изменить и сгенерировать сообщение в формате RFC 2822. Наиболее часто RFC 2822 применяется в сообщениях электронной почты в Интернете.
В пакете есть несколько модулей, назначение которых (кратко) указано ниже:
Message
Модуль определяет класс Message
— основной класс для представления сообщения в пакете email.
Parser
Модуль для разбора представленного в виде текста сообщения с получением объектной структуры сообщения.
Header
Модуль для работы с полями, в которых используется кодировка, отличная от ASCII.
Generator
Порождает текст сообщения RFC 2822 на основании объектной модели.
Utils
Различные утилиты, которые решают разнообразные небольшие задачи, связанные с сообщениями.
В пакете есть и другие модули, которые здесь рассматриваться не будут.
Разбор сообщения. Класс Message
Класс Message
— центральный во всем пакете email
. Он определяет методы для работы с сообщением, которое состоит из заголовка (header) и тела (payload). Поле заголовка имеет название и значение, разделенное двоеточием (двоеточие не входит ни в название, ни в значение). Названия полей нечувствительны к регистру букв при поиске значения, хотя хранятся с учетом регистра. В классе также определены методы для доступа к некоторым часто используемым сведениям (кодировке сообщения, типу содержимого и т.п.).
Следует заметить, что сообщение может иметь одну или несколько частей, в том числе вложенных друг в друга. Например, сообщение об ошибке доставки письма может содержать исходное письмо в качестве вложения.
Пример наиболее употребительных методов экземпляров класса Message
с пояснениями:
>>> import email
>>> input_file = open("pr1.eml")
>>> msg = email.message_from_file(input_file)
Здесь используется функция email.message_from_file()
для чтения сообщения из файла pr1.eml
. Сообщение можно получить и из строки с помощью функции email.message_from_string()
. А теперь следует произвести некоторые операции над этим сообщением (не стоит обращать внимания на странные имена — сообщение было взято из папки СПАМ). Доступ к полям по имени осуществляется так:
>>> print msg['from']
"felton olive"
>>> msg.get_all('received')
['from mail.onego.ru\n\tby localhost with POP3 (fetchmail–6.2.5
polling mail.onego.ru account spam)\n\tfor spam@localhost
(single–drop); Wed, 01 Sep 2004 15:46:33 +0400 (MSD)',
'from thecanadianteacher.com ([222.65.104.100])\n\tby mail.onego.ru
(8.12.11/8.12.11) with SMTP id i817UtUN026093;\n\tWed, 1 Sep 2004
11:30:58 +0400']
Стоит заметить, что в электронном письме может быть несколько полей с именем received
(в этом примере их два).