Простой Python. Современный стиль программирования (Любанович) - страница 123

• В первой строке могут содержаться названия колонок.

Для начала взглянем, как читать и записывать список строк, каждая из которых содержит список колонок:

>>>> import csv

>>>> villains = [

>…·····['Doctor', 'No'],

>…·····['Rosa', 'Klebb'],

>…·····['Mister', 'Big'],

>…·····['Auric', 'Goldfinger'],

>·····['Ernst', 'Blofeld'],

>…·····]

>>>> with open('villains', 'wt') as fout:··# менеджер контекста

>…·····csvout = csv.writer(fout)

>…·····csvout.writerows(villains)

Этот код создает пять записей:

>Doctor,No

>Rosa,Klebb

>Mister,Big

>Auric,Goldfinger

>Ernst,Blofeld

Теперь попробуем считать их обратно:

>>>> import csv

>>>> with open('villains', 'rt') as fin:··# менеджер контекста

>…·····cin = csv.reader(fin)

>…·····villains = [row for row in cin]··# Здесь используется включение списка

>…

>>>> print(villains)

>[['Doctor', 'No'], ['Rosa', 'Klebb'], ['Mister', 'Big'],

>['Auric', 'Goldfinger'], ['Ernst', 'Blofeld']]

Подумайте немного о включениях списка (в любой момент вы можете обратиться к разделу «Включения» главы 4, чтобы вспомнить синтаксис). Мы воспользовались структурой, созданной функцией reader(). Она услужливо создала в объекте cin ряды, которые мы можем извлечь с помощью цикла for.

Используя функции reader() и writer() с их стандартными опциями, мы получим колонки, которые разделены запятыми, и ряды, разделенные символами перевода строки.

Данные могут иметь формат списка словарей, а не списка списков. Снова считаем файл villains, в этот раз используя новую функцию DictReader() и указывая имена колонок:

>>>> import csv

>>>> with open('villains', 'rt') as fin:

>…·····cin = csv.DictReader(fin, fieldnames=['first', 'last'])

>…·····villains = [row for row in cin]

>…

>>>> print(villains)

>[{'last': 'No', 'first': 'Doctor'},

>{'last': 'Klebb', 'first': 'Rosa'},

>{'last': 'Big', 'first': 'Mister'},

>{'last': 'Goldfinger', 'first': 'Auric'},

>{'last': 'Blofeld', 'first': 'Ernst'}]

Перепишем CSV-файл с помощью новой функции DictWriter(). Мы также вызовем функцию writeheader(), чтобы записать начальную строку, содержащую имена колонок, в CSV-файл:

>import csv

>villains = [

>····{'first': 'Doctor', 'last': 'No'},

>····{'first': 'Rosa', 'last': 'Klebb'},

>····{'first': 'Mister', 'last': 'Big'},

>····{'first': 'Auric', 'last': 'Goldfinger'},

>····{'first': 'Ernst', 'last': 'Blofeld'},

>····]

>with open('villains', 'wt') as fout:

>····cout = csv.DictWriter(fout, ['first', 'last'])

>····cout.writeheader()

>····cout.writerows(villains)

Этот код создает файл villains со строкой заголовка:

>first,last

>Doctor,No

>Rosa,Klebb

>Mister,Big

>Auric,Goldfinger

>Ernst,Blofeld

Теперь считаем его обратно. Опуская аргумент fieldnames в вызове DictReader(), мы указываем функции использовать значения первой строки файла (first, last) как имена колонок и соответствующие ключи словаря: