> **Источник:** https://python-all.ru/3.2/library/csv.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 13.1. [`csv`](https://python-all.ru/3.2/library/csv.html#module-csv) – Чтение и запись CSV-файлов

Так называемый формат CSV (Comma Separated Values – значения, разделённые запятыми) – наиболее распространённый формат импорта и экспорта электронных таблиц и баз данных. Не существует «стандарта CSV», поэтому формат определяется операционно, на основе множества приложений, которые его читают и записывают. Отсутствие стандарта означает, что в данных, создаваемых и потребляемых разными приложениями, часто существуют тонкие различия. Эти различия могут затруднять обработку CSV-файлов из нескольких источников. Тем не менее, хотя разделители и символы кавычек различаются, общий формат достаточно схож, чтобы можно было написать единый модуль, способный эффективно манипулировать такими данными, скрывая от программиста детали чтения и записи.

Модуль [`csv`](https://python-all.ru/3.2/library/csv.html#module-csv) реализует классы для чтения и записи табличных данных в формате CSV. Он позволяет программистам сказать: «записать эти данные в формате, предпочитаемом Excel» или «прочитать данные из этого файла, созданного Excel», не зная точных деталей формата CSV, используемого Excel. Программисты также могут описывать форматы CSV, понятные другим приложениям, или определять свои собственные специализированные форматы CSV.

Модуль [`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).

> **См. также**
>
> **[**PEP 305**](https://python-all.ru/3.2/library/csv.html) - API для CSV-файлов**
>
> Предложение по улучшению Python, в котором было предложено это дополнение.

## 13.1.1. Содержание модуля

Модуль [`csv`](https://python-all.ru/3.2/library/csv.html#module-csv) определяет следующие функции:

#### `csv.reader(csvfile, dialect='excel', **fmtparams)`

Возвращает объект чтения, который перебирает строки в заданном *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).

Каждая строка, прочитанная из CSV-файла, возвращается в виде списка строк. Автоматическое преобразование типов данных не выполняется, если только не указана опция форматирования `QUOTE_NONNUMERIC` (в этом случае незаключенные в кавычки поля преобразуются в числа с плавающей запятой).

Краткий пример использования:

```python
>>> 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)`

Возвращает объект записи, который преобразует пользовательские данные в строки с разделителями для указанного файлоподобного объекта. *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).

Краткий пример использования:

```python
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`](https://python-all.ru/3.2/library/csv.html#csv.Dialect), или с помощью именованных аргументов *fmtparams*, или обоими способами; при этом именованные аргументы переопределяют параметры диалекта. Полные сведения о диалекте и параметрах форматирования см. в разделе [*Диалекты и параметры форматирования*](https://python-all.ru/3.2/library/csv.html#csv-fmt-params).

#### `csv.unregister_dialect(name)`

Удаляет диалект, связанный с *name*, из реестра диалектов. Исключение [`Error`](https://python-all.ru/3.2/library/csv.html#csv.Error) возбуждается, если *name* не является зарегистрированным именем диалекта.

#### `csv.get_dialect(name)`

Возвращает диалект, связанный с *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).

#### `csv.list_dialects()`

Возвращает имена всех зарегистрированных диалектов.

#### `csv.field_size_limit([new_limit])`

Возвращает текущий максимальный размер поля, разрешенный парсером. Если задан *new\_limit*, он становится новым лимитом.

Модуль [`csv`](https://python-all.ru/3.2/library/csv.html#module-csv) определяет следующие классы:

#### `class csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)`

Создаёт объект, который работает как обычный reader, но преобразует прочитанные данные в словарь (dict), ключи которого задаются необязательным параметром *fieldnames*. Если параметр *fieldnames* опущен, в качестве имён полей используются значения первой строки *csvfile*. Если прочитанная строка содержит больше полей, чем последовательность fieldnames, оставшиеся данные добавляются как последовательность, ключом которой служит значение *restkey*. Если прочитанная строка содержит меньше полей, чем последовательность fieldnames, оставшиеся ключи принимают значение необязательного параметра *restval*. Все остальные необязательные или ключевые аргументы передаются экземпляру [`reader`](https://python-all.ru/3.2/library/csv.html#csv.reader).

#### `class csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)`

Создаёт объект, который работает как обычный 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).

Обратите внимание: в отличие от класса [`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*.

#### `class csv.Dialect`

Класс [`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).

#### `class csv.excel`

Класс [`excel`](https://python-all.ru/3.2/library/csv.html#csv.excel) определяет обычные свойства CSV-файла, созданного Excel. Он зарегистрирован под именем диалекта `'excel'`.

#### `class csv.excel_tab`

Класс [`excel_tab`](https://python-all.ru/3.2/library/csv.html#csv.excel_tab) определяет обычные свойства файла с разделителями-табуляцией, созданного Excel. Он зарегистрирован под именем диалекта `'excel-tab'`.

#### `class csv.unix_dialect`

Класс [`unix_dialect`](https://python-all.ru/3.2/library/csv.html#csv.unix_dialect) определяет обычные свойства CSV-файла, созданного в UNIX-системах, т.е. использующего `'\n'` в качестве завершителя строки и заключающего все поля в кавычки. Он зарегистрирован под именем диалекта `'unix'`.

Новое в версии 3.2.

#### `class csv.Sniffer`

Класс [`Sniffer`](https://python-all.ru/3.2/library/csv.html#csv.Sniffer) используется для определения формата CSV-файла.

Класс [`Sniffer`](https://python-all.ru/3.2/library/csv.html#csv.Sniffer) предоставляет два метода:

#### `sniff(sample, delimiters=None)`

Анализирует заданный образец *sample* и возвращает подкласс [`Dialect`](https://python-all.ru/3.2/library/csv.html#csv.Dialect), отражающий найденные параметры. Если задан необязательный параметр *delimiters*, он интерпретируется как строка, содержащая возможные допустимые символы-разделители.

#### `has_header(sample)`

Анализирует образец текста (предположительно в формате CSV) и возвращает [`True`](https://python-all.ru/3.2/library/constants.html#True), если первая строка выглядит как набор заголовков столбцов.

Пример использования [`Sniffer`](https://python-all.ru/3.2/library/csv.html#csv.Sniffer):

```python
with open('example.csv') as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
    # ... здесь обрабатывается содержимое CSV-файла ...
```

Модуль [`csv`](https://python-all.ru/3.2/library/csv.html#module-csv) определяет следующие константы:

#### `csv.QUOTE_ALL`

Указывает объектам [`writer`](https://python-all.ru/3.2/library/csv.html#csv.writer) заключать все поля в кавычки.

#### `csv.QUOTE_MINIMAL`

Указывает объектам [`writer`](https://python-all.ru/3.2/library/csv.html#csv.writer) заключать в кавычки только те поля, которые содержат специальные символы, такие как *delimiter*, *quotechar* или любые символы из *lineterminator*.

#### `csv.QUOTE_NONNUMERIC`

Указывает объектам [`writer`](https://python-all.ru/3.2/library/csv.html#csv.writer) заключать в кавычки все нечисловые поля.

Указывает объекту чтения преобразовывать все нецитируемые поля в тип *float*.

#### `csv.QUOTE_NONE`

Указывает объектам [`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), если будут встречены символы, требующие экранирования.

Указывает объектам [`reader`](https://python-all.ru/3.2/library/csv.html#csv.reader) не выполнять никакой специальной обработки символов кавычек.

Модуль [`csv`](https://python-all.ru/3.2/library/csv.html#module-csv) определяет следующее исключение:

#### `exception csv.Error`

Возбуждается любой из функций при обнаружении ошибки.

## 13.1.2. Диалекты и параметры форматирования

Чтобы упростить задание формата входных и выходных записей, конкретные параметры форматирования группируются в диалекты. Диалект – это подкласс класса [`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).

Диалекты поддерживают следующие атрибуты:

#### `Dialect.delimiter`

Односимвольная строка, используемая для разделения полей. По умолчанию равна `','`.

#### `Dialect.doublequote`

Управляет тем, как экземпляры *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).

При выводе, если *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*.

#### `Dialect.escapechar`

Односимвольная строка, используемая 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), что отключает экранирование.

#### `Dialect.lineterminator`

Строка, используемая для завершения строк, создаваемых [`writer`](https://python-all.ru/3.2/library/csv.html#csv.writer). По умолчанию равна `'\r\n'`.

> **Примечание**
>
> [`reader`](https://python-all.ru/3.2/library/csv.html#csv.reader) жёстко запрограммирован распознавать `'\r'` или `'\n'` как конец строки и игнорирует *lineterminator*. Это поведение может измениться в будущем.

#### `Dialect.quotechar`

Односимвольная строка, используемая для заключения в кавычки полей, содержащих специальные символы, такие как *разделитель* или *quotechar*, или содержащих символы новой строки. По умолчанию `'"'`.

#### `Dialect.quoting`

Управляет тем, когда кавычки должны генерироваться писателем и распознаваться читателем. Он может принимать любую из констант `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).

#### `Dialect.skipinitialspace`

Если [`True`](https://python-all.ru/3.2/library/constants.html#True), пробелы, непосредственно следующие за *разделителем*, игнорируются. Значение по умолчанию – [`False`](https://python-all.ru/3.2/library/constants.html#False).

#### `Dialect.strict`

Если `True`, при некорректном CSV-вводе возбуждается исключение [`Error`](https://python-all.ru/3.2/library/csv.html#csv.Error). Значение по умолчанию – `False`.

## 13.1.3. Объекты Reader

Объекты-читатели (экземпляры [`DictReader`](https://python-all.ru/3.2/library/csv.html#csv.DictReader) и объекты, возвращаемые функцией [`reader()`](https://python-all.ru/3.2/library/csv.html#csv.reader)) имеют следующие открытые методы:

#### `csvreader.__next__()`

Возвращает следующую строку итерируемого объекта читателя в виде списка, разобранную в соответствии с текущим диалектом. Обычно следует вызывать это как `next(reader)`.

Объекты reader имеют следующие открытые атрибуты:

#### `csvreader.dialect`

Доступное только для чтения описание диалекта, используемого синтаксическим анализатором.

#### `csvreader.line_num`

Количество строк, прочитанных из итератора-источника. Это число не совпадает с количеством возвращённых записей, так как записи могут занимать несколько строк.

Объекты DictReader имеют следующий открытый атрибут:

#### `csvreader.fieldnames`

Если этот атрибут не был передан в качестве параметра при создании объекта, он инициализируется при первом обращении или при чтении первой записи из файла.

## 13.1.4. Объекты Writer

Объекты-писатели (`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-файлы (если они вообще поддерживают комплексные числа).

#### `csvwriter.writerow(row)`

Записывает параметр *row* в файловый объект writer, отформатировав в соответствии с текущим диалектом.

#### `csvwriter.writerows(rows)`

Записывает все параметры *rows* (список объектов *row*, как описано выше) в файловый объект writer, форматируя в соответствии с текущим диалектом.

Объекты Writer имеют следующий открытый атрибут:

#### `csvwriter.dialect`

Описание диалекта, используемого средством записи, доступное только для чтения.

Объекты DictWriter имеют следующий открытый метод:

#### `DictWriter.writeheader()`

Записывает строку с названиями полей (как указано в конструкторе).

Новое в версии 3.2.

## 13.1.5. Примеры

Простейший пример чтения CSV-файла:

```python
import csv
with open('some.csv', newline='') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
```

Чтение файла в альтернативном формате:

```python
import csv
with open('passwd', newline='') as f:
    reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
    for row in reader:
        print(row)
```

Соответствующий простейший пример записи:

```python
import csv
with open('some.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerows(someiterable)
```

Поскольку [`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:

```python
import csv
with open('some.csv', newline='', encoding='utf-8') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)
```

То же самое относится к записи в кодировке, отличной от системной: укажите аргумент encoding при открытии выходного файла.

Регистрация нового диалекта:

```python
import csv
csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)
with open('passwd', newline='') as f:
    reader = csv.reader(f, 'unixpwd')
```

Чуть более продвинутое использование reader – перехват и сообщение об ошибках:

```python
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))
```

И хотя модуль напрямую не поддерживает разбор строк, это можно легко сделать:

```python
import csv
for row in csv.reader(['one,two,three']):
    print(row)
```

Сноски

| \[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)). |
| --- | --- |
