csv — Чтение и запись файлов CSV
Исходный код: Lib/csv.py
Формат CSV (Comma Separated Values) — это наиболее распространённый формат импорта и экспорта для электронных таблиц и баз данных. Формат CSV использовался на протяжении многих лет до попыток описать его в стандартизированном виде в RFC 4180. Отсутствие хорошо определенного стандарта означает, что часто существуют небольшие различия в данных, производимых и потребляемых различными приложениями. Эти различия могут затруднять обработку файлов CSV из нескольких источников. Тем не менее, хотя разделители и символы кавычек различаются, общий формат достаточно похож, чтобы можно было написать один модуль, который может эффективно обрабатывать такие данные, скрывая от программиста детали чтения и записи данных.
Модуль csv реализует классы для чтения и записи табличных данных в формате CSV. Он позволяет программистам сказать: «запишите эти данные в формате, предпочтительном для Excel», или «прочитайте данные из этого файла, который был сгенерирован в Excel», не зная точных деталей используемого формата CSV в Excel. Программисты также могут описать форматы CSV, понимаемые другими приложениями, или определить свои собственные форматы CSV для специальных целей.
Модуль csv объекты reader и writer читают и записывают последовательности. Программисты также могут читать и записывать данные в виде словарей, используя классы DictReader и DictWriter.
См. также
- PEP 305 — API файлов CSV
-
Предложение по улучшению Python, которое предложило это дополнение к Python.
Содержание модуля
Модуль csv определяет следующие функции:
-
csv.reader(csvfile, dialect='excel', **fmtparams) -
Возвращает объект reader, который будет перебирать строки в заданном csvfile. csvfile может быть любым объектом, поддерживающим протокол итератор и возвращающим строку каждый раз, когда вызывается его метод
__next__(). — объекты файлов и списки являются подходящими. Если csvfile — это объект файла, он должен быть открыт с помощьюnewline=''. 1 В качестве необязательного параметра можно указать диалект, который используется для определения набора параметров, специфичных для определенного диалекта 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. В качестве необязательного параметра можно указать диалект, который используется для определения набора параметров, специфичных для определенного диалекта CSV. Он может быть экземпляром подкласса классаDialectили одной из строк, возвращаемых функциейlist_dialects(). Другие необязательные ключевые аргументы fmtparams могут быть переданы для переопределения отдельных параметров форматирования в текущем диалекте. Для наилучшего взаимодействия с модулями, реализующими 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, или ключевые аргументы fmtparams, или то и другое, при этом ключевые аргументы переопределяют параметры диалекта. Подробные сведения о диалекте и параметрах форматирования см. в разделе Диалекты и параметры форматирования.
-
csv.unregister_dialect(name) -
Удаляет диалект, связанный с именем, из реестра диалектов. Если имя не является зарегистрированным именем диалекта, возникает
Error.
-
csv.get_dialect(name) -
Возвращает диалект, связанный с именем. Если имя не является зарегистрированным именем диалекта, возникает
Error. Эта функция возвращает неизменяемый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 будут использованы в качестве имён полей. Независимо от того, как определяются имена полей, упорядоченный словарь сохраняет их исходное упорядочение.
Если строка имеет больше полей, чем имён полей, оставшиеся данные помещаются в список и хранятся с именем поля, указанным в restkey (по умолчанию
None). Если в непустой строке меньше полей, чем имён полей, пропущенные значения заполняются значением restval (по умолчанию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не является необязательным.Короткий пример использования:
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предоставляет два метода:-
sniff(sample, delimiters=None) -
Анализирует предоставленный образец и возвращает подкласс
Dialect, отражающий найденные параметры. Если задан необязательный параметр разделители, он интерпретируется как строка, содержащая возможные допустимые символы-разделители.
-
has_header(sample) -
Анализирует образец текста (предполагается, что он в формате CSV) и возвращает
True, если первая строка, по-видимому, представляет собой набор заголовков столбцов.
-
Пример использования Sniffer:
with open('example.csv', newline='') as csvfile:
dialect = csv.Sniffer().sniff(csvfile.read(1024))
csvfile.seek(0)
reader = csv.reader(csvfile, dialect)
# ... process CSV file contents here ...
Модуль csv определяет следующие константы:
-
csv.QUOTE_ALL -
Указывает объектам
writerзаключить все поля в кавычки.
-
csv.QUOTE_MINIMAL -
Указывает объектам
writerзаключать в кавычки только те поля, которые содержат специальные символы, такие как разделитель, quotechar или любые символы из lineterminator.
-
csv.QUOTE_NONNUMERIC -
Указывает объектам
writerзаключать в кавычки все нечисловые поля.Указывает читателю преобразовать все не заключённые в кавычки поля в тип float.
-
csv.QUOTE_NONE -
Указывает объектам
writerникогда не заключать поля в кавычки. Когда в выходных данных встречается текущий разделитель, перед ним ставится текущий символ escapechar. Если escapechar не задан, писатель генерируетError, если обнаружены символы, требующие экранирования.Указывает
readerне выполнять специальной обработки символов кавычек.
Модуль csv определяет следующее исключение:
-
exception csv.Error -
Выбрасывается любыми функциями при обнаружении ошибки.
Диалекты и параметры форматирования
Чтобы проще было указать формат входных и выходных записей, параметры форматирования сгруппированы в диалекты. Диалект — это подкласс класса Dialect с набором специфических методов и одним методом validate(). При создании объектов reader или writer программист может указать строку или подкласс класса Dialect в качестве параметра диалекта. В дополнение к или вместо параметра диалект программист также может указать отдельные параметры форматирования, которые имеют те же имена, что и атрибуты, определённые ниже для класса Dialect.
Диалекты поддерживают следующие атрибуты:
-
Dialect.delimiter -
Односимвольная строка, используемая для разделения полей. По умолчанию это
','.
-
Dialect.doublequote -
Управляет тем, как экземпляры quotechar, встречающиеся внутри поля, должны быть сами заключены в кавычки. При значении
Trueсимвол дублируется. При значенииFalseсимвол escapechar используется как префикс к quotechar. По умолчаниюTrue.При выводе, если doublequote имеет значение
Falseи escapechar не задан, возникаетError, если в поле найден quotechar.
-
Dialect.escapechar -
Односимвольная строка, используемая писателем для экранирования разделителя, если 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.
Объекты-читатели
Объекты-читатели (DictReader и объекты, возвращаемые функцией reader()) имеют следующие публичные методы:
-
csvreader.__next__() -
Возвращает следующую строку объекта-итератора читателя в виде списка (если объект был возвращён из
reader()) или словаря (если это экземплярDictReader), разобранный в соответствии с текущим диалектом. Обычно вы должны вызывать это какnext(reader).
Объекты-читатели имеют следующие публичные атрибуты:
-
csvreader.dialect -
Только для чтения описание диалекта, используемого анализатором.
-
csvreader.line_num -
Количество строк, прочитанных из источника-итератора. Это не то же самое, что количество возвращённых записей, поскольку записи могут охватывать несколько строк.
Объекты DictReader имеют следующие открытые атрибуты:
-
csvreader.fieldnames -
Если этот атрибут не был передан в качестве параметра при создании объекта, он инициализируется при первом обращении или при чтении первой записи из файла.
Объекты записывателя
Объекты Writer (DictWriter экземпляры и объекты, возвращаемые функцией writer()) имеют следующие открытые методы. Строка должна быть итерируемым объектом строк или чисел для объектов Writer, и словарем, сопоставляющим имена полей со строками или числами (сперва передав их через str()) для объектов DictWriter. Обратите внимание, что комплексные числа записываются в окружении скобок. Это может вызвать некоторые проблемы для других программ, которые читают CSV-файлы (предполагая, что они вообще поддерживают комплексные числа).
-
csvwriter.writerow(row) -
Записать параметр строка в объект файла записывателя, отформатированный в соответствии с текущим диалектом.
Изменено в версии 3.5: Добавлена поддержка произвольных итерируемых объектов.
-
csvwriter.writerows(rows) -
Записать все элементы в строки (итерируемый объект объектов строки, как описано выше) в объект файла записывателя, отформатированный в соответствии с текущим диалектом.
Объекты записывателя имеют следующие открытые атрибуты:
-
csvwriter.dialect -
Только для чтения описание диалекта, используемого записывателем.
Объекты DictWriter имеют следующие открытые методы:
-
DictWriter.writeheader() -
Записать строку с именами полей (как указано в конструкторе).
Добавлен в версии 3.2.
Примеры
Самый простой пример чтения 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)
Поскольку для открытия CSV-файла для чтения используется open(), файл по умолчанию будет декодирован в 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)
То же самое относится к записи в кодировку, отличную от системной по умолчанию: укажите параметр кодировки при открытии выходного файла.
Регистрация нового диалекта:
import csv
csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)
with open('passwd', newline='') as f:
reader = csv.reader(f, 'unixpwd')
Несколько более продвинутое использование читателя — перехват и отчет об ошибках:
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 выполняет свою собственную (универсальную) обработку новых строк.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/csv.html