Документация Python неофициальный перевод
Содержание страницы

13.1. csv – Чтение и запись CSV-файловcsv – CSV File Reading and Writing

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

Модуль csv реализует классы для чтения и записи табличных данных в формате CSV. Он позволяет программистам сказать: «записать эти данные в формате, предпочитаемом Excel» или «прочитать данные из этого файла, созданного Excel», не зная точных деталей формата CSV, используемого Excel. Программисты также могут описывать форматы CSV, понятные другим приложениям, или определять свои собственные специализированные форматы CSV.

Модуль csv предоставляет объекты reader и writer, которые читают и записывают последовательности. Программисты также могут читать и записывать данные в виде словарей, используя классы DictReader и DictWriter.

См. также

PEP 305 - API для CSV-файлов
Предложение по улучшению Python, в котором было предложено это дополнение.

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

Модуль csv определяет следующие функции:

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

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

Возвращает объект записи, который преобразует пользовательские данные в строки с разделителями для указанного файлоподобного объекта. 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(csvfile, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)

Создаёт объект, который работает как обычный reader, но преобразует прочитанные данные в словарь (dict), ключи которого задаются необязательным параметром fieldnames. Если параметр fieldnames опущен, в качестве имён полей используются значения первой строки csvfile. Если прочитанная строка содержит больше полей, чем последовательность fieldnames, оставшиеся данные добавляются как последовательность, ключом которой служит значение restkey. Если прочитанная строка содержит меньше полей, чем последовательность fieldnames, оставшиеся ключи принимают значение необязательного параметра restval. Все остальные необязательные или ключевые аргументы передаются экземпляру reader.

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

Создаёт объект, который работает как обычный writer, но преобразует словари в выходные строки. Параметр fieldnames определяет порядок, в котором значения словаря, переданного методу writerow(), записываются в csvfile. Необязательный параметр restval задаёт значение, которое будет записано, если в словаре отсутствует ключ из fieldnames. Если словарь, переданный методу writerow(), содержит ключ, отсутствующий в fieldnames, необязательный параметр extrasaction указывает, какое действие предпринять. Если он установлен в 'raise', возбуждается исключение ValueError. Если установлен в 'ignore', дополнительные значения в словаре игнорируются. Все остальные необязательные или ключевые аргументы передаются экземпляру writer.

Обратите внимание: в отличие от класса DictReader, параметр fieldnames DictWriter обязателен. Поскольку объекты dict в Python не упорядочены, недостаточно информации, чтобы определить порядок, в котором строка должна быть записана в csvfile.

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 предоставляет два метода:

sniff(sample, delimiters=None)

Анализирует заданный образец sample и возвращает подкласс Dialect, отражающий найденные параметры. Если задан необязательный параметр delimiters, он интерпретируется как строка, содержащая возможные допустимые символы-разделители.

has_header(sample)

Анализирует образец текста (предположительно в формате CSV) и возвращает True, если первая строка выглядит как набор заголовков столбцов.

Пример использования Sniffer:

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

Модуль csv определяет следующие константы:

csv.QUOTE_ALL

Указывает объектам writer заключать все поля в кавычки.

csv.QUOTE_MINIMAL

Указывает объектам writer заключать в кавычки только те поля, которые содержат специальные символы, такие как delimiter, quotechar или любые символы из lineterminator.

csv.QUOTE_NONNUMERIC

Указывает объектам writer заключать в кавычки все нечисловые поля.

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

csv.QUOTE_NONE

Указывает объектам writer никогда не заключать поля в кавычки. Когда текущий delimiter встречается в выходных данных, перед ним ставится текущий символ escapechar. Если escapechar не задан, writer вызовет Error, если будут встречены символы, требующие экранирования.

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

Модуль csv определяет следующее исключение:

exception csv.Error

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

13.1.2. Диалекты и параметры форматированияDialects and Formatting Parameters

Чтобы упростить задание формата входных и выходных записей, конкретные параметры форматирования группируются в диалекты. Диалект – это подкласс класса Dialect, имеющий набор определённых методов и единственный метод validate(). При создании объектов reader или writer программист может указать строку или подкласс класса Dialect в качестве параметра диалекта. В дополнение к параметру dialect или вместо него программист может также указать отдельные параметры форматирования, которые имеют те же имена, что и атрибуты, определённые ниже для класса Dialect.

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

Dialect.delimiter

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

Dialect.doublequote

Управляет тем, как экземпляры quotechar, появляющиеся внутри поля, должны экранироваться. Когда True, символ удваивается. Когда False, escapechar используется как префикс перед quotechar. По умолчанию True.

При выводе, если doublequote равно False и не задан escapechar, возникает Error, если в поле обнаружен quotechar.

Dialect.escapechar

Односимвольная строка, используемая writer для экранирования delimiter, если quoting установлен в QUOTE_NONE, и quotechar, если doublequote равно False. При чтении escapechar удаляет любое специальное значение из следующего символа. По умолчанию None, что отключает экранирование.

Dialect.lineterminator

Строка, используемая для завершения строк, создаваемых writer. По умолчанию равна '\r\n'.

Примечание

reader жёстко запрограммирован распознавать '\r' или '\n' как конец строки и игнорирует lineterminator. Это поведение может измениться в будущем.

Dialect.quotechar

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

Dialect.quoting

Управляет тем, когда кавычки должны генерироваться писателем и распознаваться читателем. Он может принимать любую из констант QUOTE_* (см. раздел Содержание модуля) и по умолчанию равен QUOTE_MINIMAL.

Dialect.skipinitialspace

Если True, пробелы, непосредственно следующие за разделителем, игнорируются. Значение по умолчанию – False.

Dialect.strict

Если True, при некорректном CSV-вводе возбуждается исключение Error. Значение по умолчанию – False.

13.1.3. Объекты ReaderReader Objects

Объекты-читатели (экземпляры DictReader и объекты, возвращаемые функцией reader()) имеют следующие открытые методы:

csvreader.__next__()

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

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

csvreader.dialect

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

csvreader.line_num

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

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

csvreader.fieldnames

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

13.1.4. Объекты WriterWriter Objects

Объекты-писатели (Writer) (экземпляры DictWriter и объекты, возвращаемые функцией writer()) имеют следующие открытые методы. Строка должна быть последовательностью строк или чисел для объектов Writer и словарём, отображающим имена полей на строки или числа (предварительно пропуская их через str()) для объектов DictWriter. Обратите внимание, что комплексные числа записываются в скобках. Это может вызвать проблемы у других программ, читающих CSV-файлы (если они вообще поддерживают комплексные числа).

csvwriter.writerow(row)

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

csvwriter.writerows(rows)

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

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

csvwriter.dialect

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

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

DictWriter.writeheader()

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

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

13.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 выполняет собственную обработку символов новой строки (универсальную).