• В первой строке могут содержаться названия колонок.
Для начала взглянем, как читать и записывать список строк, каждая из которых содержит список колонок:
>>>> 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) как имена колонок и соответствующие ключи словаря: