Содержание страницы
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, в котором было предложено это дополнение.
Содержимое модуля¶Module Contents
Модуль csv определяет следующие функции:
- csv.reader(csvfile, dialect='excel', **fmtparams)¶
Возвращает объект reader, который будет обрабатывать строки из заданного csvfile. csvfile должен быть итерируемым объектом строк, каждая из которых соответствует формату CSV, определенному в reader. Обычно csvfile – это файлоподобный объект или список. Если 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, но сопоставляет информацию из каждой строки с
dict, ключи которого задаются необязательным параметром fieldnames.Параметр fieldnames – это последовательность. Если fieldnames опущен, в качестве имён полей используются значения из первой строки файла f, и они не включаются в результаты. Если fieldnames указан, то используются они, а первая строка включается в результаты. Независимо от того, как определены имена полей, словарь сохраняет их исходный порядок.
Если в строке больше полей, чем имён полей, оставшиеся данные помещаются в список и сохраняются под именем поля, указанным в restkey (по умолчанию
None). Если непустая строка содержит меньше полей, чем имён полей, недостающие значения заполняются значением restval (по умолчаниюNone).Все остальные необязательные и именованные аргументы передаются базовому экземпляру
reader.Если аргумент, переданный в fieldnames, является итератором, он будет преобразован в
list.Изменено в версии 3.6: Возвращаемые строки теперь имеют тип
OrderedDict.Изменено в версии 3.8: Возвращаемые строки теперь имеют тип
dict.Краткий пример использования:
>>> 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) {'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не является необязательным.Если аргумент, переданный в fieldnames, является итератором, он будет преобразован в
list.Краткий пример использования:
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– это класс-контейнер, атрибуты которого содержат информацию о том, как обрабатывать двойные кавычки, пробелы, разделители и т.д. Из-за отсутствия строгой спецификации CSV разные приложения создают незначительно различающиеся CSV-данные. ЭкземплярыDialectопределяют поведение экземпляровreaderиwriter.Все доступные имена
Dialectвозвращаются функциейlist_dialects(), и их можно зарегистрировать для конкретных классовreaderиwriterчерез их функции инициализации (__init__), например:import csv with open('students.csv', 'w', newline='') as csvfile: writer = csv.writer(csvfile, dialect='unix')
- 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, если первая строка выглядит как набор заголовков столбцов. При проверке каждого столбца учитывается один из двух ключевых критериев для оценки, содержит ли образец заголовок:со второй по n-ю строки содержат числовые значения.
со второй по n-ю строки содержат строки, где длина хотя бы одного значения отличается от длины предполагаемого заголовка этого столбца.
После первой строки выбирается двадцать строк; если более половины столбцов + строк удовлетворяют условиям, возвращается
True.
Примечание
Этот метод является грубой эвристикой и может давать как ложноположительные, так и ложноотрицательные результаты.
Пример использования 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заключать все нечисловые поля в кавычки.Указывает объектам
readerпреобразовывать все незаключенные в кавычки поля к типу float.
- csv.QUOTE_NONE¶
Указывает объектам
writerникогда не заключать поля в кавычки. Если текущий разделитель встречается в выходных данных, перед ним ставится текущий символ escapechar. Если escapechar не задан, объект writer вызоветError, если встретятся символы, требующие экранирования.Указывает объектам
readerне выполнять специальную обработку символов кавычек.
- csv.QUOTE_NOTNULL¶
Указывает объектам
writerзаключать в кавычки все поля, которые не являютсяNone. Это похоже наQUOTE_ALL, за исключением того, что если значение поля равноNone, записывается пустая (незаключённая в кавычки) строка.Указывает объектам
readerинтерпретировать пустое (незаключённое в кавычки) поле какNone, а в остальном вести себя какQUOTE_ALL.Добавлено в версии 3.12.
- csv.QUOTE_STRINGS¶
Указывает объектам
writerвсегда заключать в кавычки поля, являющиеся строками. Это похоже наQUOTE_NONNUMERIC, за исключением того, что если значение поля равноNone, записывается пустая (незаключённая в кавычки) строка.Указывает объектам
readerинтерпретировать пустую (незаключённую в кавычки) строку какNone, а в остальном вести себя какQUOTE_NONNUMERIC.Добавлено в версии 3.12.
Примечание
Из-за ошибки константы QUOTE_NOTNULL и QUOTE_STRINGS не влияют на поведение объектов reader. Эта ошибка исправлена в Python 3.13.
Модуль csv определяет следующее исключение:
- exception csv.Error¶
Возбуждается любой из функций при обнаружении ошибки.
Диалекты и параметры форматирования¶Dialects and Formatting Parameters
Чтобы упростить задание формата входных и выходных записей, определённые
параметры форматирования группируются в диалекты. Диалект представляет собой
подкласс класса Dialect, содержащий различные атрибуты,
описывающие формат CSV-файла. При создании объектов reader или
writer программист может указать строку или подкласс
класса 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, что отключает экранирование.Изменено в версии 3.11: Пустое значение escapechar не допускается.
- Dialect.lineterminator¶
Строка, используемая для завершения строк, создаваемых
writer. По умолчанию равна'\r\n'.Примечание
Модуль
readerжёстко запрограммирован распознавать'\r'или'\n'как конец строки и игнорировать lineterminator. В будущем это поведение может измениться.
- Dialect.quotechar¶
Односимвольная строка, используемая для заключения в кавычки полей, содержащих специальные символы, такие как разделитель или quotechar, или содержащих символы новой строки. По умолчанию
'"'.Изменено в версии 3.11: Пустое значение quotechar не допускается.
- Dialect.quoting¶
Управляет тем, когда кавычки должны создаваться объектом writer и распознаваться объектом reader. Может принимать любое значение из констант QUOTE_*; по умолчанию
QUOTE_MINIMAL.
Объекты Reader¶Reader Objects
Объекты reader (экземпляры DictReader и объекты, возвращаемые функцией reader()) имеют следующие открытые методы:
- csvreader.__next__()¶
Возвращает следующую строку итерируемого объекта reader в виде списка (если объект был возвращён из
reader()) или словаря (если это экземплярDictReader), разобранную в соответствии с текущимDialect. Обычно это вызывается какnext(reader).
Объекты reader имеют следующие открытые атрибуты:
- csvreader.dialect¶
Доступное только для чтения описание диалекта, используемого синтаксическим анализатором.
- csvreader.line_num¶
Количество строк, прочитанных из итератора-источника. Это число не совпадает с количеством возвращённых записей, так как записи могут занимать несколько строк.
Объекты DictReader имеют следующий открытый атрибут:
- DictReader.fieldnames¶
Если этот атрибут не был передан в качестве параметра при создании объекта, он инициализируется при первом обращении или при чтении первой записи из файла.
Объекты Writer¶Writer Objects
Объекты writer (экземпляры DictWriter и объекты, возвращаемые функцией writer()) имеют следующие открытые методы. Параметр row должен быть итерацией строк или чисел для объектов writer и словарём, сопоставляющим имена полей со строками или числами (предварительно пропустив их через str()) для объектов DictWriter. Обратите внимание, что комплексные числа записываются в круглых скобках. Это может вызвать некоторые проблемы для других программ, читающих CSV-файлы (если они вообще поддерживают комплексные числа).
- csvwriter.writerow(row)¶
Записывает параметр row в файловый объекта средства записи, форматируя в соответствии с текущим
Dialect. Возвращает значение, возвращённое вызовом метода write базового файлового объекта.Изменено в версии 3.5: Добавлена поддержка произвольных итераций.
- csvwriter.writerows(rows)¶
Записывает все элементы из rows (итерацию объектов row, как описано выше) в файловый объекта средства записи, форматируя в соответствии с текущим диалектом.
Объекты Writer имеют следующий открытый атрибут:
- csvwriter.dialect¶
Описание диалекта, используемого средством записи, доступное только для чтения.
Объекты DictWriter имеют следующий открытый метод:
- DictWriter.writeheader()¶
Записывает строку с именами полей (как указано в конструкторе) в файловый объекта средства записи, форматируя в соответствии с текущим диалектом. Возвращает значение, возвращённое внутренним вызовом
csvwriter.writerow().Добавлено в версии 3.2.
Изменено в версии 3.8:
writeheader()теперь также возвращает значение, возвращаемое используемым внутренне методомcsvwriter.writerow().
Примеры¶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.getencoding()). Чтобы декодировать файл с другой кодировкой, используйте аргумент 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)
Сноски
Эта страница – перевод. Оригинал на английском – docs.python.org. Нашли неточность? Сообщите нам.