Содержание страницы
14.1. csv– чтение и запись CSV-файлов¶csv – CSV File Reading and Writing
Исходный код: Lib/csv.py
Так называемый формат CSV (Comma Separated Values) – самый распространенный формат импорта и экспорта для электронных таблиц и баз данных. Формат CSV использовался много лет до попыток дать ему стандартизированное описание в RFC 4180. Отсутствие четкого стандарта приводит к тому, что в данных, создаваемых и используемых разными приложениями, часто встречаются незначительные различия. Из-за этих различий обработка CSV-файлов из разных источников может быть утомительной. Тем не менее, хотя разделители и символы кавычек различаются, общий формат достаточно схож, чтобы можно было написать один модуль, способный эффективно работать с такими данными, скрывая от программиста детали чтения и записи.
Модуль csv реализует классы для чтения и записи табличных данных в формате CSV. Он позволяет программистам сказать: «запиши эти данные в формате, предпочитаемом Excel» или «прочитай данные из этого файла, созданного Excel», не вдаваясь в точные детали формата CSV, используемого Excel. Программисты также могут описывать форматы CSV, используемые другими приложениями, или определять собственные специализированные форматы CSV.
Объекты reader и writer модуля csv читают и записывают последовательности. Программисты также могут читать и записывать данные в словарной форме, используя классы DictReader и DictWriter.
См. также
- PEP 305 - API для CSV-файлов
Предложение по улучшению Python, в котором было предложено это дополнение.
14.1.1. Содержание модуля¶Module Contents
Модуль csv определяет следующие функции:
-
csv.reader(csvfile, dialect='excel', **fmtparams)¶ Возвращает объект reader, который перебирает строки в указанном csvfile. csvfile может быть любым объектом, поддерживающим протокол итератора и возвращающим строку при каждом вызове метода
__next__()– подходят как файловые объекты, так и списки. Если csvfile является файловым объектом, он должен быть открыт сnewline=''. 1 Можно указать необязательный параметр dialect, который задаёт набор параметров, специфичных для конкретного диалекта CSV. Он может быть экземпляром подкласса классаDialectили одной из строк, возвращаемых функциейlist_dialects(). Остальные необязательные именованные аргументы fmtparams можно указать для переопределения отдельных параметров форматирования в текущем диалекте. Подробнее о диалекте и параметрах форматирования см. в разделе Диалекты и параметры форматирования.Каждая строка, прочитанная из CSV-файла, возвращается в виде списка строк. Автоматическое преобразование типов данных не выполняется, если не задан параметр формата
QUOTE_NONNUMERIC(в этом случае незакавыченные поля преобразуются в числа с плавающей запятой).Краткий пример использования:
>>> import csv >>> with open('eggs.csv', newline='') as csvfile: ... spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') ... for row in spamreader: ... print(', '.join(row)) Spam, Spam, Spam, Spam, Spam, Baked Beans Spam, Lovely Spam, Wonderful Spam
-
csv.writer(csvfile, dialect='excel', **fmtparams)¶ Возвращает объект writer, который преобразует данные пользователя в строки с разделителями и записывает их в переданный файлоподобный объект. csvfile может быть любым объектом, имеющим метод
write(). Если csvfile – файловый объект, он должен быть открыт сnewline=''1. Можно указать необязательный параметр dialect, который задаёт набор параметров для определённого диалекта CSV. Он может быть экземпляром подклассаDialectили одной из строк, возвращаемых функциейlist_dialects(). Остальные необязательные именованные аргументы fmtparams можно задать, чтобы переопределить отдельные параметры форматирования в текущем диалекте. Подробнее о диалектах и параметрах форматирования см. раздел Диалекты и параметры форматирования. Чтобы упростить взаимодействие с модулями, реализующими DB API, значениеNoneзаписывается как пустая строка. Хотя это преобразование не является обратимым, оно упрощает выгрузку значений SQL NULL в CSV-файлы без предварительной обработки данных, возвращаемых вызовомcursor.fetch*. Все остальные нестроковые данные преобразуются в строки с помощьюstr()перед записью.Краткий пример использования:
import csv with open('eggs.csv', 'w', newline='') as csvfile: spamwriter = csv.writer(csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL) spamwriter.writerow(['Spam'] * 5 + ['Baked Beans']) spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
-
csv.register_dialect(name[, dialect[, **fmtparams]])¶ Связывает dialect с name. name должен быть строкой. Диалект может быть задан передачей подкласса
Dialect, или именованными аргументами fmtparams, или и тем и другим; именованные аргументы переопределяют параметры диалекта. Подробнее о диалектах и параметрах форматирования см. раздел Диалекты и параметры форматирования.
-
csv.unregister_dialect(name)¶ Удаляет диалект, связанный с name, из реестра диалектов. Возникает исключение
Error, если name не является зарегистрированным именем диалекта.
-
csv.get_dialect(name)¶ Возвращает диалект, связанный с name. Возникает исключение
Error, если name не является зарегистрированным именем диалекта. Эта функция возвращает неизменяемыйDialect.
-
csv.list_dialects()¶ Возвращает имена всех зарегистрированных диалектов.
-
csv.field_size_limit([new_limit])¶ Возвращает текущий максимальный размер поля, разрешенный парсером. Если задан new_limit, он становится новым лимитом.
Модуль csv определяет следующие классы:
-
class
csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)¶ Создаёт объект, который работает как обычный reader, но сопоставляет информацию из каждой строки с
OrderedDict, ключи которого задаются необязательным параметром fieldnames.Параметр fieldnames – это последовательность. Если fieldnames опущен, в качестве названий полей используются значения первой строки файла f. Независимо от того, как определяются названия полей, упорядоченный словарь сохраняет их исходный порядок.
Если строка содержит больше полей, чем fieldnames, оставшиеся данные помещаются в список и сохраняются с именем поля, указанным в restkey (по умолчанию
None). Если непустая строка содержит меньше полей, чем fieldnames, недостающие значения заполняютсяNone.Все остальные необязательные и именованные аргументы передаются базовому экземпляру
reader.Изменено в версии 3.6: Возвращаемые строки теперь имеют тип
OrderedDict.Краткий пример использования:
>>> import csv >>> with open('names.csv', newline='') as csvfile: ... reader = csv.DictReader(csvfile) ... for row in reader: ... print(row['first_name'], row['last_name']) ... Eric Idle John Cleese >>> print(row) OrderedDict([('first_name', 'John'), ('last_name', 'Cleese')])
-
class
csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)¶ Создаёт объект, который работает как обычный writer, но отображает словари на выходные строки. Параметр fieldnames – это
sequenceключей, определяющих порядок, в котором значения из словаря, переданного методуwriterow(), записываются в файл f. Необязательный параметр restval задаёт значение, которое будет записано, если в словаре отсутствует ключ из fieldnames. Если словарь, переданный методуwriterow(), содержит ключ, отсутствующий в fieldnames, необязательный параметр extrasaction указывает, какие действия предпринять. Если он установлен в'raise'(значение по умолчанию), возбуждаетсяValueError. Если он установлен в'ignore', дополнительные значения в словаре игнорируются. Все остальные необязательные и именованные аргументы передаются базовому экземпляруwriter.Обратите внимание, что в отличие от класса
DictReader, параметр fieldnames вDictWriterне является необязательным. Поскольку объектыdictв Python не упорядочены, недостаточно информации, чтобы определить порядок, в котором строка должна быть записана в файл f.Краткий пример использования:
import csv with open('names.csv', 'w', newline='') as csvfile: fieldnames = ['first_name', 'last_name'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'}) writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'}) writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
-
class
csv.Dialect¶ Класс
Dialect– это контейнерный класс, используемый в первую очередь для своих атрибутов, которые задают параметры для конкретного экземпляраreaderилиwriter.
-
class
csv.excel¶ Класс
excelопределяет обычные свойства CSV-файла, созданного в Excel. Он зарегистрирован под именем диалекта'excel'.
-
class
csv.excel_tab¶ Класс
excel_tabопределяет обычные свойства файла с разделителями табуляции, созданного в Excel. Он зарегистрирован под именем диалекта'excel-tab'.
-
class
csv.unix_dialect¶ Класс
unix_dialectопределяет обычные свойства CSV-файла, созданного в UNIX-системах, то есть использующего'\n'в качестве завершителя строк и заключающего все поля в кавычки. Он зарегистрирован под именем диалекта'unix'.Новое в версии 3.2.
-
class
csv.Sniffer¶ Класс
Snifferиспользуется для определения формата CSV-файла.Класс
Snifferпредоставляет два метода:
Пример использования Sniffer:
with open('example.csv', newline='') as csvfile:
dialect = csv.Sniffer().sniff(csvfile.read(1024))
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
# ... здесь обрабатывается содержимое CSV-файла ...
Модуль csv определяет следующие константы:
-
csv.QUOTE_MINIMAL¶ Указывает объектам
writerзаключать в кавычки только те поля, которые содержат специальные символы, такие как разделитель, символ кавычки или любой из символов терминатора строки.
-
csv.QUOTE_NONNUMERIC¶ Указывает объектам
writerзаключать все нечисловые поля в кавычки.Указывает объекту чтения преобразовывать все нецитируемые поля в тип float.
-
csv.QUOTE_NONE¶ Указывает объектам
writerникогда не заключать поля в кавычки. Если текущий разделитель встречается в выходных данных, перед ним ставится текущий символ escapechar. Если escapechar не задан, объект writer вызоветError, если встретятся символы, требующие экранирования.Указывает
readerне выполнять специальной обработки символов кавычек.
Модуль csv определяет следующее исключение:
-
exception
csv.Error¶ Возбуждается любой из функций при обнаружении ошибки.
14.1.2. Диалекты и параметры форматирования¶Dialects and Formatting Parameters
Чтобы упростить задание формата входных и выходных записей, определённые
параметры форматирования группируются в диалекты. Диалект – это подкласс класса Dialect, имеющий набор определённых методов и единственный метод validate(). При создании объектов reader или writer программист может указать в качестве параметра dialect строку или подкласс класса Dialect. В дополнение к параметру dialect или вместо него программист может также указать отдельные
параметры форматирования, имена которых совпадают с атрибутами класса Dialect, определёнными ниже.
Диалекты поддерживают следующие атрибуты:
-
Dialect.delimiter¶ Односимвольная строка, используемая для разделения полей. По умолчанию равна
','.
-
Dialect.doublequote¶ Управляет тем, как должны заключаться в кавычки экземпляры quotechar, встречающиеся внутри поля. Когда
True, символ удваивается. КогдаFalse, escapechar используется в качестве префикса для quotechar. По умолчаниюTrue.При выводе, если doublequote равно
Falseи escapechar не задан, возбуждаетсяError, если в поле обнаружен quotechar.
-
Dialect.escapechar¶ Односимвольная строка, используемая объектом writer для экранирования разделителя, если для quoting установлено значение
QUOTE_NONE, и quotechar, если doublequote равноFalse. При чтении escapechar снимает особое значение со следующего символа. По умолчаниюNone, что отключает экранирование.
-
Dialect.lineterminator¶ Строка, используемая для завершения строк, создаваемых
writer. По умолчанию равна'\r\n'.Примечание
Модуль
readerжёстко запрограммирован распознавать'\r'или'\n'как конец строки и игнорировать lineterminator. В будущем это поведение может измениться.
-
Dialect.quotechar¶ Односимвольная строка, используемая для заключения в кавычки полей, содержащих специальные символы, такие как разделитель или quotechar, или содержащих символы новой строки. По умолчанию
'"'.
-
Dialect.quoting¶ Управляет тем, когда кавычки должны генерироваться писателем (writer) и распознаваться читателем (reader). Может принимать любое из значений констант
QUOTE_*(см. раздел Содержание модуля); по умолчаниюQUOTE_MINIMAL.
14.1.3. Объекты Reader¶Reader Objects
Объекты reader (экземпляры DictReader и объекты, возвращаемые функцией reader()) имеют следующие открытые методы:
-
csvreader.__next__()¶ Возвращает следующую строку итерируемого объекта reader в виде списка (если объект был возвращён из
reader()) или словаря (если это экземплярDictReader), разобранную в соответствии с текущим диалектом. Обычно это следует вызывать какnext(reader).
Объекты reader имеют следующие открытые атрибуты:
-
csvreader.dialect¶ Доступное только для чтения описание диалекта, используемого синтаксическим анализатором.
-
csvreader.line_num¶ Количество строк, прочитанных из итератора-источника. Это число не совпадает с количеством возвращённых записей, так как записи могут занимать несколько строк.
Объекты DictReader имеют следующий открытый атрибут:
-
csvreader.fieldnames¶ Если этот атрибут не был передан в качестве параметра при создании объекта, он инициализируется при первом обращении или при чтении первой записи из файла.
14.1.4. Объекты Writer¶Writer Objects
Объекты Writer (экземпляры DictWriter и объекты, возвращаемые функцией writer()) имеют следующие открытые методы. Параметр row должен быть итерацией строк или чисел для объектов Writer и словарём, сопоставляющим имена полей со строками или числами (предварительно пропустив их через str()) для объектов DictWriter. Обратите внимание, что комплексные числа записываются в круглых скобках. Это может вызвать некоторые проблемы для других программ, читающих CSV-файлы (если они вообще поддерживают комплексные числа).
-
csvwriter.writerow(row)¶ Записывает параметр row в файловый объект writer, отформатировав в соответствии с текущим диалектом.
Изменено в версии 3.5: Добавлена поддержка произвольных итераций.
-
csvwriter.writerows(rows)¶ Записывает все элементы из rows (итерацию объектов row, как описано выше) в файловый объекта средства записи, форматируя в соответствии с текущим диалектом.
Объекты Writer имеют следующий открытый атрибут:
-
csvwriter.dialect¶ Описание диалекта, используемого средством записи, доступное только для чтения.
Объекты DictWriter имеют следующий открытый метод:
-
DictWriter.writeheader()¶ Записывает строку с названиями полей (как указано в конструкторе).
Новое в версии 3.2.
14.1.5. Примеры¶Examples
Простейший пример чтения CSV-файла:
import csv
with open('some.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)
Чтение файла в альтернативном формате:
import csv
with open('passwd', newline='') as f:
reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
for row in reader:
print(row)
Соответствующий простейший пример записи:
import csv
with open('some.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerows(someiterable)
Поскольку open() используется для открытия CSV-файла для чтения, файл по умолчанию будет декодирован в Unicode с использованием системной кодировки по умолчанию (см. locale.getpreferredencoding()). Чтобы декодировать файл с другой кодировкой, используйте аргумент encoding функции open:
import csv
with open('some.csv', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)
То же самое относится к записи в кодировке, отличной от системной: укажите аргумент encoding при открытии выходного файла.
Регистрация нового диалекта:
import csv
csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)
with open('passwd', newline='') as f:
reader = csv.reader(f, 'unixpwd')
Чуть более продвинутое использование reader – перехват и сообщение об ошибках:
import csv, sys
filename = 'some.csv'
with open(filename, newline='') as f:
reader = csv.reader(f)
try:
for row in reader:
print(row)
except csv.Error as e:
sys.exit('file {}, line {}: {}'.format(filename, reader.line_num, e))
И хотя модуль напрямую не поддерживает разбор строк, это можно легко сделать:
import csv
for row in csv.reader(['one,two,three']):
print(row)
Сноски
- 1(1,2)
Если
newline=''не указан, символы новой строки внутри полей в кавычках не будут интерпретироваться правильно, и на платформах, использующих\r\nокончания строк, при записи будет добавлен лишний\r. Всегда безопасно указыватьnewline='', поскольку модуль csv выполняет свою собственную (универсальную) обработку символов новой строки.