csv.md
1> **Источник:** https://python-all.ru/3.2/library/csv.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 13.1. [`csv`](https://python-all.ru/3.2/library/csv.html#module-csv) – Чтение и запись CSV-файлов89Так называемый формат CSV (Comma Separated Values – значения, разделённые запятыми) – наиболее распространённый формат импорта и экспорта электронных таблиц и баз данных. Не существует «стандарта CSV», поэтому формат определяется операционно, на основе множества приложений, которые его читают и записывают. Отсутствие стандарта означает, что в данных, создаваемых и потребляемых разными приложениями, часто существуют тонкие различия. Эти различия могут затруднять обработку CSV-файлов из нескольких источников. Тем не менее, хотя разделители и символы кавычек различаются, общий формат достаточно схож, чтобы можно было написать единый модуль, способный эффективно манипулировать такими данными, скрывая от программиста детали чтения и записи.1011Модуль [`csv`](https://python-all.ru/3.2/library/csv.html#module-csv) реализует классы для чтения и записи табличных данных в формате CSV. Он позволяет программистам сказать: «записать эти данные в формате, предпочитаемом Excel» или «прочитать данные из этого файла, созданного Excel», не зная точных деталей формата CSV, используемого Excel. Программисты также могут описывать форматы CSV, понятные другим приложениям, или определять свои собственные специализированные форматы CSV.1213Модуль [`csv`](https://python-all.ru/3.2/library/csv.html#module-csv) предоставляет объекты [`reader`](https://python-all.ru/3.2/library/csv.html#csv.reader) и [`writer`](https://python-all.ru/3.2/library/csv.html#csv.writer), которые читают и записывают последовательности. Программисты также могут читать и записывать данные в виде словарей, используя классы [`DictReader`](https://python-all.ru/3.2/library/csv.html#csv.DictReader) и [`DictWriter`](https://python-all.ru/3.2/library/csv.html#csv.DictWriter).1415> **См. также**16>17> **[**PEP 305**](https://python-all.ru/3.2/library/csv.html) - API для CSV-файлов**18>19> Предложение по улучшению Python, в котором было предложено это дополнение.2021## 13.1.1. Содержание модуля2223Модуль [`csv`](https://python-all.ru/3.2/library/csv.html#module-csv) определяет следующие функции:2425#### `csv.reader(csvfile, dialect='excel', **fmtparams)`2627Возвращает объект чтения, который перебирает строки в заданном *csvfile*. *csvfile* может быть любым объектом, поддерживающим протокол [*итератора*](https://python-all.ru/3.2/glossary.html#term-iterator) и возвращающим строку при каждом вызове метода `__next__()` – подходят как [*файловые объекты*](https://python-all.ru/3.2/glossary.html#term-file-object), так и списки. Если *csvfile* является файловым объектом, его следует открывать с `newline=''`. [\[1\]](https://python-all.ru/3.2/library/csv.html#id3) Можно передать необязательный параметр *dialect*, который задаёт набор параметров для конкретного диалекта CSV. Это может быть экземпляр подкласса класса [`Dialect`](https://python-all.ru/3.2/library/csv.html#csv.Dialect) или одна из строк, возвращаемых функцией [`list_dialects()`](https://python-all.ru/3.2/library/csv.html#csv.list_dialects). Другие необязательные именованные аргументы *fmtparams* позволяют переопределить отдельные параметры форматирования текущего диалекта. Полные сведения о диалекте и параметрах форматирования см. в разделе [*Диалекты и параметры форматирования*](https://python-all.ru/3.2/library/csv.html#csv-fmt-params).2829Каждая строка, прочитанная из CSV-файла, возвращается в виде списка строк. Автоматическое преобразование типов данных не выполняется, если только не указана опция форматирования `QUOTE_NONNUMERIC` (в этом случае незаключенные в кавычки поля преобразуются в числа с плавающей запятой).3031Краткий пример использования:3233```python34>>> import csv35>>> with open('eggs.csv', newline='') as csvfile:36... spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')37... for row in spamreader:38... print(', '.join(row))39Spam, Spam, Spam, Spam, Spam, Baked Beans40Spam, Lovely Spam, Wonderful Spam41```4243#### `csv.writer(csvfile, dialect='excel', **fmtparams)`4445Возвращает объект записи, который преобразует пользовательские данные в строки с разделителями для указанного файлоподобного объекта. *csvfile* может быть любым объектом с методом `write()`. Если *csvfile* является файловым объектом, его следует открывать с `newline=''` [\[1\]](https://python-all.ru/3.2/library/csv.html#id3). Можно передать необязательный параметр *dialect*, задающий набор параметров для конкретного диалекта CSV. Это может быть экземпляр подкласса класса [`Dialect`](https://python-all.ru/3.2/library/csv.html#csv.Dialect) или одна из строк, возвращаемых функцией [`list_dialects()`](https://python-all.ru/3.2/library/csv.html#csv.list_dialects). Другие необязательные именованные аргументы *fmtparams* позволяют переопределить отдельные параметры форматирования текущего диалекта. Полные сведения о диалекте и параметрах форматирования см. в разделе [*Диалекты и параметры форматирования*](https://python-all.ru/3.2/library/csv.html#csv-fmt-params). Чтобы упростить взаимодействие с модулями, реализующими DB API, значение [`None`](https://python-all.ru/3.2/library/constants.html#None) записывается как пустая строка. Хотя это преобразование необратимо, оно упрощает выгрузку значений SQL NULL в CSV-файлы без предварительной обработки данных, возвращаемых вызовом `cursor.fetch*`. Все остальные нестроковые данные перед записью преобразуются в строки с помощью [`str()`](https://python-all.ru/3.2/library/functions.html#str).4647Краткий пример использования:4849```python50import csv51with open('eggs.csv', 'w', newline='') as csvfile:52 spamwriter = csv.writer(csvfile, delimiter=' ',53 quotechar='|', quoting=csv.QUOTE_MINIMAL)54 spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])55 spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])56```5758#### `csv.register_dialect(name[, dialect], **fmtparams)`5960Связывает *dialect* с именем *name*. *name* должен быть строкой. Диалект можно задать, передав подкласс [`Dialect`](https://python-all.ru/3.2/library/csv.html#csv.Dialect), или с помощью именованных аргументов *fmtparams*, или обоими способами; при этом именованные аргументы переопределяют параметры диалекта. Полные сведения о диалекте и параметрах форматирования см. в разделе [*Диалекты и параметры форматирования*](https://python-all.ru/3.2/library/csv.html#csv-fmt-params).6162#### `csv.unregister_dialect(name)`6364Удаляет диалект, связанный с *name*, из реестра диалектов. Исключение [`Error`](https://python-all.ru/3.2/library/csv.html#csv.Error) возбуждается, если *name* не является зарегистрированным именем диалекта.6566#### `csv.get_dialect(name)`6768Возвращает диалект, связанный с *name*. Исключение [`Error`](https://python-all.ru/3.2/library/csv.html#csv.Error) возбуждается, если *name* не является зарегистрированным именем диалекта. Эта функция возвращает неизменяемый [`Dialect`](https://python-all.ru/3.2/library/csv.html#csv.Dialect).6970#### `csv.list_dialects()`7172Возвращает имена всех зарегистрированных диалектов.7374#### `csv.field_size_limit([new_limit])`7576Возвращает текущий максимальный размер поля, разрешенный парсером. Если задан *new\_limit*, он становится новым лимитом.7778Модуль [`csv`](https://python-all.ru/3.2/library/csv.html#module-csv) определяет следующие классы:7980#### `class csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)`8182Создаёт объект, который работает как обычный reader, но преобразует прочитанные данные в словарь (dict), ключи которого задаются необязательным параметром *fieldnames*. Если параметр *fieldnames* опущен, в качестве имён полей используются значения первой строки *csvfile*. Если прочитанная строка содержит больше полей, чем последовательность fieldnames, оставшиеся данные добавляются как последовательность, ключом которой служит значение *restkey*. Если прочитанная строка содержит меньше полей, чем последовательность fieldnames, оставшиеся ключи принимают значение необязательного параметра *restval*. Все остальные необязательные или ключевые аргументы передаются экземпляру [`reader`](https://python-all.ru/3.2/library/csv.html#csv.reader).8384#### `class csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)`8586Создаёт объект, который работает как обычный writer, но преобразует словари в выходные строки. Параметр *fieldnames* определяет порядок, в котором значения словаря, переданного методу `writerow()`, записываются в *csvfile*. Необязательный параметр *restval* задаёт значение, которое будет записано, если в словаре отсутствует ключ из *fieldnames*. Если словарь, переданный методу `writerow()`, содержит ключ, отсутствующий в *fieldnames*, необязательный параметр *extrasaction* указывает, какое действие предпринять. Если он установлен в `'raise'`, возбуждается исключение [`ValueError`](https://python-all.ru/3.2/library/exceptions.html#ValueError). Если установлен в `'ignore'`, дополнительные значения в словаре игнорируются. Все остальные необязательные или ключевые аргументы передаются экземпляру [`writer`](https://python-all.ru/3.2/library/csv.html#csv.writer).8788Обратите внимание: в отличие от класса [`DictReader`](https://python-all.ru/3.2/library/csv.html#csv.DictReader), параметр *fieldnames* [`DictWriter`](https://python-all.ru/3.2/library/csv.html#csv.DictWriter) обязателен. Поскольку объекты [`dict`](https://python-all.ru/3.2/library/stdtypes.html#dict) в Python не упорядочены, недостаточно информации, чтобы определить порядок, в котором строка должна быть записана в *csvfile*.8990#### `class csv.Dialect`9192Класс [`Dialect`](https://python-all.ru/3.2/library/csv.html#csv.Dialect) – это класс-контейнер, используемый в основном для своих атрибутов, которые определяют параметры для конкретного экземпляра [`reader`](https://python-all.ru/3.2/library/csv.html#csv.reader) или [`writer`](https://python-all.ru/3.2/library/csv.html#csv.writer).9394#### `class csv.excel`9596Класс [`excel`](https://python-all.ru/3.2/library/csv.html#csv.excel) определяет обычные свойства CSV-файла, созданного Excel. Он зарегистрирован под именем диалекта `'excel'`.9798#### `class csv.excel_tab`99100Класс [`excel_tab`](https://python-all.ru/3.2/library/csv.html#csv.excel_tab) определяет обычные свойства файла с разделителями-табуляцией, созданного Excel. Он зарегистрирован под именем диалекта `'excel-tab'`.101102#### `class csv.unix_dialect`103104Класс [`unix_dialect`](https://python-all.ru/3.2/library/csv.html#csv.unix_dialect) определяет обычные свойства CSV-файла, созданного в UNIX-системах, т.е. использующего `'\n'` в качестве завершителя строки и заключающего все поля в кавычки. Он зарегистрирован под именем диалекта `'unix'`.105106Новое в версии 3.2.107108#### `class csv.Sniffer`109110Класс [`Sniffer`](https://python-all.ru/3.2/library/csv.html#csv.Sniffer) используется для определения формата CSV-файла.111112Класс [`Sniffer`](https://python-all.ru/3.2/library/csv.html#csv.Sniffer) предоставляет два метода:113114#### `sniff(sample, delimiters=None)`115116Анализирует заданный образец *sample* и возвращает подкласс [`Dialect`](https://python-all.ru/3.2/library/csv.html#csv.Dialect), отражающий найденные параметры. Если задан необязательный параметр *delimiters*, он интерпретируется как строка, содержащая возможные допустимые символы-разделители.117118#### `has_header(sample)`119120Анализирует образец текста (предположительно в формате CSV) и возвращает [`True`](https://python-all.ru/3.2/library/constants.html#True), если первая строка выглядит как набор заголовков столбцов.121122Пример использования [`Sniffer`](https://python-all.ru/3.2/library/csv.html#csv.Sniffer):123124```python125with open('example.csv') as csvfile:126 dialect = csv.Sniffer().sniff(csvfile.read(1024))127 csvfile.seek(0)128 reader = csv.reader(csvfile, dialect)129 # ... здесь обрабатывается содержимое CSV-файла ...130```131132Модуль [`csv`](https://python-all.ru/3.2/library/csv.html#module-csv) определяет следующие константы:133134#### `csv.QUOTE_ALL`135136Указывает объектам [`writer`](https://python-all.ru/3.2/library/csv.html#csv.writer) заключать все поля в кавычки.137138#### `csv.QUOTE_MINIMAL`139140Указывает объектам [`writer`](https://python-all.ru/3.2/library/csv.html#csv.writer) заключать в кавычки только те поля, которые содержат специальные символы, такие как *delimiter*, *quotechar* или любые символы из *lineterminator*.141142#### `csv.QUOTE_NONNUMERIC`143144Указывает объектам [`writer`](https://python-all.ru/3.2/library/csv.html#csv.writer) заключать в кавычки все нечисловые поля.145146Указывает объекту чтения преобразовывать все нецитируемые поля в тип *float*.147148#### `csv.QUOTE_NONE`149150Указывает объектам [`writer`](https://python-all.ru/3.2/library/csv.html#csv.writer) никогда не заключать поля в кавычки. Когда текущий *delimiter* встречается в выходных данных, перед ним ставится текущий символ *escapechar*. Если *escapechar* не задан, writer вызовет [`Error`](https://python-all.ru/3.2/library/csv.html#csv.Error), если будут встречены символы, требующие экранирования.151152Указывает объектам [`reader`](https://python-all.ru/3.2/library/csv.html#csv.reader) не выполнять никакой специальной обработки символов кавычек.153154Модуль [`csv`](https://python-all.ru/3.2/library/csv.html#module-csv) определяет следующее исключение:155156#### `exception csv.Error`157158Возбуждается любой из функций при обнаружении ошибки.159160## 13.1.2. Диалекты и параметры форматирования161162Чтобы упростить задание формата входных и выходных записей, конкретные параметры форматирования группируются в диалекты. Диалект – это подкласс класса [`Dialect`](https://python-all.ru/3.2/library/csv.html#csv.Dialect), имеющий набор определённых методов и единственный метод `validate()`. При создании объектов [`reader`](https://python-all.ru/3.2/library/csv.html#csv.reader) или [`writer`](https://python-all.ru/3.2/library/csv.html#csv.writer) программист может указать строку или подкласс класса [`Dialect`](https://python-all.ru/3.2/library/csv.html#csv.Dialect) в качестве параметра диалекта. В дополнение к параметру *dialect* или вместо него программист может также указать отдельные параметры форматирования, которые имеют те же имена, что и атрибуты, определённые ниже для класса [`Dialect`](https://python-all.ru/3.2/library/csv.html#csv.Dialect).163164Диалекты поддерживают следующие атрибуты:165166#### `Dialect.delimiter`167168Односимвольная строка, используемая для разделения полей. По умолчанию равна `','`.169170#### `Dialect.doublequote`171172Управляет тем, как экземпляры *quotechar*, появляющиеся внутри поля, должны экранироваться. Когда [`True`](https://python-all.ru/3.2/library/constants.html#True), символ удваивается. Когда [`False`](https://python-all.ru/3.2/library/constants.html#False), *escapechar* используется как префикс перед *quotechar*. По умолчанию [`True`](https://python-all.ru/3.2/library/constants.html#True).173174При выводе, если *doublequote* равно [`False`](https://python-all.ru/3.2/library/constants.html#False) и не задан *escapechar*, возникает [`Error`](https://python-all.ru/3.2/library/csv.html#csv.Error), если в поле обнаружен *quotechar*.175176#### `Dialect.escapechar`177178Односимвольная строка, используемая writer для экранирования *delimiter*, если *quoting* установлен в [`QUOTE_NONE`](https://python-all.ru/3.2/library/csv.html#csv.QUOTE_NONE), и *quotechar*, если *doublequote* равно [`False`](https://python-all.ru/3.2/library/constants.html#False). При чтении *escapechar* удаляет любое специальное значение из следующего символа. По умолчанию [`None`](https://python-all.ru/3.2/library/constants.html#None), что отключает экранирование.179180#### `Dialect.lineterminator`181182Строка, используемая для завершения строк, создаваемых [`writer`](https://python-all.ru/3.2/library/csv.html#csv.writer). По умолчанию равна `'\r\n'`.183184> **Примечание**185>186> [`reader`](https://python-all.ru/3.2/library/csv.html#csv.reader) жёстко запрограммирован распознавать `'\r'` или `'\n'` как конец строки и игнорирует *lineterminator*. Это поведение может измениться в будущем.187188#### `Dialect.quotechar`189190Односимвольная строка, используемая для заключения в кавычки полей, содержащих специальные символы, такие как *разделитель* или *quotechar*, или содержащих символы новой строки. По умолчанию `'"'`.191192#### `Dialect.quoting`193194Управляет тем, когда кавычки должны генерироваться писателем и распознаваться читателем. Он может принимать любую из констант `QUOTE_*` (см. раздел [*Содержание модуля*](https://python-all.ru/3.2/library/csv.html#csv-contents)) и по умолчанию равен [`QUOTE_MINIMAL`](https://python-all.ru/3.2/library/csv.html#csv.QUOTE_MINIMAL).195196#### `Dialect.skipinitialspace`197198Если [`True`](https://python-all.ru/3.2/library/constants.html#True), пробелы, непосредственно следующие за *разделителем*, игнорируются. Значение по умолчанию – [`False`](https://python-all.ru/3.2/library/constants.html#False).199200#### `Dialect.strict`201202Если `True`, при некорректном CSV-вводе возбуждается исключение [`Error`](https://python-all.ru/3.2/library/csv.html#csv.Error). Значение по умолчанию – `False`.203204## 13.1.3. Объекты Reader205206Объекты-читатели (экземпляры [`DictReader`](https://python-all.ru/3.2/library/csv.html#csv.DictReader) и объекты, возвращаемые функцией [`reader()`](https://python-all.ru/3.2/library/csv.html#csv.reader)) имеют следующие открытые методы:207208#### `csvreader.__next__()`209210Возвращает следующую строку итерируемого объекта читателя в виде списка, разобранную в соответствии с текущим диалектом. Обычно следует вызывать это как `next(reader)`.211212Объекты reader имеют следующие открытые атрибуты:213214#### `csvreader.dialect`215216Доступное только для чтения описание диалекта, используемого синтаксическим анализатором.217218#### `csvreader.line_num`219220Количество строк, прочитанных из итератора-источника. Это число не совпадает с количеством возвращённых записей, так как записи могут занимать несколько строк.221222Объекты DictReader имеют следующий открытый атрибут:223224#### `csvreader.fieldnames`225226Если этот атрибут не был передан в качестве параметра при создании объекта, он инициализируется при первом обращении или при чтении первой записи из файла.227228## 13.1.4. Объекты Writer229230Объекты-писатели (`Writer`) (экземпляры [`DictWriter`](https://python-all.ru/3.2/library/csv.html#csv.DictWriter) и объекты, возвращаемые функцией [`writer()`](https://python-all.ru/3.2/library/csv.html#csv.writer)) имеют следующие открытые методы. *Строка* должна быть последовательностью строк или чисел для объектов `Writer` и словарём, отображающим имена полей на строки или числа (предварительно пропуская их через [`str()`](https://python-all.ru/3.2/library/functions.html#str)) для объектов [`DictWriter`](https://python-all.ru/3.2/library/csv.html#csv.DictWriter). Обратите внимание, что комплексные числа записываются в скобках. Это может вызвать проблемы у других программ, читающих CSV-файлы (если они вообще поддерживают комплексные числа).231232#### `csvwriter.writerow(row)`233234Записывает параметр *row* в файловый объект writer, отформатировав в соответствии с текущим диалектом.235236#### `csvwriter.writerows(rows)`237238Записывает все параметры *rows* (список объектов *row*, как описано выше) в файловый объект writer, форматируя в соответствии с текущим диалектом.239240Объекты Writer имеют следующий открытый атрибут:241242#### `csvwriter.dialect`243244Описание диалекта, используемого средством записи, доступное только для чтения.245246Объекты DictWriter имеют следующий открытый метод:247248#### `DictWriter.writeheader()`249250Записывает строку с названиями полей (как указано в конструкторе).251252Новое в версии 3.2.253254## 13.1.5. Примеры255256Простейший пример чтения CSV-файла:257258```python259import csv260with open('some.csv', newline='') as f:261 reader = csv.reader(f)262 for row in reader:263 print(row)264```265266Чтение файла в альтернативном формате:267268```python269import csv270with open('passwd', newline='') as f:271 reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)272 for row in reader:273 print(row)274```275276Соответствующий простейший пример записи:277278```python279import csv280with open('some.csv', 'w', newline='') as f:281 writer = csv.writer(f)282 writer.writerows(someiterable)283```284285Поскольку [`open()`](https://python-all.ru/3.2/library/functions.html#open) используется для открытия CSV-файла для чтения, файл по умолчанию будет декодирован в Unicode с использованием системной кодировки по умолчанию (см. [`locale.getpreferredencoding()`](https://python-all.ru/3.2/library/locale.html#locale.getpreferredencoding)). Чтобы декодировать файл с другой кодировкой, используйте аргумент `encoding` функции open:286287```python288import csv289with open('some.csv', newline='', encoding='utf-8') as f:290 reader = csv.reader(f)291 for row in reader:292 print(row)293```294295То же самое относится к записи в кодировке, отличной от системной: укажите аргумент encoding при открытии выходного файла.296297Регистрация нового диалекта:298299```python300import csv301csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)302with open('passwd', newline='') as f:303 reader = csv.reader(f, 'unixpwd')304```305306Чуть более продвинутое использование reader – перехват и сообщение об ошибках:307308```python309import csv, sys310filename = 'some.csv'311with open(filename, newline='') as f:312 reader = csv.reader(f)313 try:314 for row in reader:315 print(row)316 except csv.Error as e:317 sys.exit('file {}, line {}: {}'.format(filename, reader.line_num, e))318```319320И хотя модуль напрямую не поддерживает разбор строк, это можно легко сделать:321322```python323import csv324for row in csv.reader(['one,two,three']):325 print(row)326```327328Сноски329330| \[1\] | *([1](https://python-all.ru/3.2/library/csv.html#id1), [2](https://python-all.ru/3.2/library/csv.html#id2))* Если `newline=''` не указан, символы новой строки, встроенные в поля в кавычках, не будут интерпретироваться правильно, а на платформах, использующих `\r\n` в качестве окончания строки, при записи будет добавлен лишний `\r`. Указывать `newline=''` всегда должно быть безопасно, поскольку модуль csv выполняет собственную обработку символов новой строки ([*универсальную*](https://python-all.ru/3.2/glossary.html#term-universal-newlines)). |331| --- | --- |332