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.
14.1.1. Содержание модуля
Модуль csv определяет следующие функции:
-
csv.reader(csvfile, dialect='excel', **fmtparams) -
Возвращает объект читателя, который будет итерироваться по строкам в заданном 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) -
Возвращает объект записи, ответственный за преобразование данных пользователя в ограниченные разделителями строки в заданном объекте, подобном файлу. 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) -
Создаёт объект, который работает как обычный читатель, но отображает информацию в каждой строке на
OrderedDict, ключами которого являются значения, задаваемые необязательным параметром fieldnames.Параметр fieldnames — это последовательность. Если fieldnames опущен, значения в первой строке файла f будут использоваться в качестве имён полей. Независимо от того, как определяются имена полей, упорядоченный словарь сохраняет их исходное упорядочение.
Если строка имеет больше полей, чем имён полей, оставшиеся данные помещаются в список и хранятся с именем поля, заданным restkey (по умолчанию
None). Если в непустой строке меньше полей, чем имён полей, пропущенные значения заполняются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) -
Создайте объект, который работает как обычный писатель, но отображает словари в строки вывода. Параметр fieldnames — это
sequenceключей, которые определяют порядок, в котором значения в словаре, переданном методуwriterow(), записываются в файл f. Необязательный параметр restval задаёт значение, которое должно быть записано, если в словаре отсутствует ключ в fieldnames. Если словарь, переданный методуwriterow(), содержит ключ, не найденный в fieldnames, необязательный параметр extrasaction указывает, какое действие предпринять. Если он установлен в значение'raise', по умолчанию, генерируетсяValueError. Если он установлен в значение'ignore', дополнительные значения в словаре игнорируются. Любые другие необязательные или ключевые параметры передаются в базовый экземплярwriter.Обратите внимание, что в отличие от класса
DictReader, параметр fieldnames классаDictWriterне является необязательным. Поскольку объекты Pythondictне упорядочены, нет достаточной информации, чтобы определить порядок записи строки в файл f.Пример краткого использования:
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определяет обычные свойства файла с разделителем 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', 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цитировать только те поля, которые содержат специальные символы, такие как delimiter, quotechar или любой из символов в lineterminator.
-
csv.QUOTE_NONNUMERIC -
Инструктирует объекты
writerцитировать все нечисловые поля.Инструктирует читатель преобразовать все нецитируемые поля в тип float.
-
csv.QUOTE_NONE -
Инструктирует объекты
writerникогда не цитировать поля. Когда текущий delimiter встречается в выходных данных, перед ним ставится текущий символ escapechar. Если escapechar не задан, писатель вызоветError, если встретятся какие-либо символы, требующие экранирования.Инструктирует
readerне выполнять специальной обработки символов цитирования.
Модуль csv определяет следующую ошибку:
-
exception csv.Error -
Возникает в любой из функций, когда обнаружена ошибка.
14.1.2. Диалекты и параметры форматирования
Для упрощения задания формата входных и выходных записей, параметры форматирования сгруппированы в диалекты. Диалект — это подкласс класса Dialect, имеющий набор определённых методов и единственный метод validate(). При создании объектов reader или writer, программист может указать строку или подкласс класса Dialect в качестве параметра диалекта. В дополнение к параметру dialect, или вместо него, программист также может указать отдельные параметры форматирования, которые имеют те же имена, что и атрибуты, определённые ниже для класса Dialect.
Диалекты поддерживают следующие атрибуты:
-
Dialect.delimiter -
Односимвольная строка, используемая для разделения полей. По умолчанию она равна
','.
-
Dialect.doublequote -
Управляет тем, как экземпляры quotechar, появляющиеся внутри поля, должны быть сами цитированы. Когда
True, символ дублируется. КогдаFalse, используется символ escapechar как префикс к quotechar. По умолчанию он равенTrue.На выходе, если doublequote равен
False, а escapechar не задан,Errorгенерируется, если quotechar найден в поле.
-
Dialect.escapechar -
Односимвольная строка, используемая писателем для экранирования delimiter, если quoting установлено в
QUOTE_NONE, и quotechar, если doublequote равенFalse. При чтении escapechar удаляет любое специальное значение из последующего символа. По умолчанию он равенNone, что отключает экранирование.
-
Dialect.lineterminator -
Строка, используемая для завершения строк, созданных
writer. По умолчанию она равна'\r\n'.Примечание
Читатель
readerжестко закодирован для распознавания'\r'или'\n'как конца строки и игнорирует lineterminator. Это поведение может измениться в будущем.
-
Dialect.quotechar -
Односимвольная строка, используемая для цитирования полей, содержащих специальные символы, такие как delimiter или quotechar, или которые содержат символы новой строки. По умолчанию она равна
'"'.
-
Dialect.quoting -
Управляет тем, когда цитирование должно генерироваться писателем и распознаваться читателем. Он может принимать любые из констант
QUOTE_*(см. раздел Содержание модуля) и по умолчанию равенQUOTE_MINIMAL.
-
Dialect.skipinitialspace -
Если значение
True, пробелы сразу после разделителя игнорируются. По умолчанию установлено значениеFalse.
-
Dialect.strict -
Если
True, при некорректном вводе CSV генерируется исключениеError. По умолчаниюFalse.
14.1.3. Объекты-читатели
Объекты-читатели (DictReader и объекты, возвращаемые функцией reader()) имеют следующие публичные методы:
-
csvreader.__next__() -
Возвращает следующую строку итерируемого объекта читателя в виде списка (если объект возвращён из
reader()) или словаря (если это экземплярDictReader), разобранной в соответствии с текущим диалектом. Обычно вы должны вызывать это какnext(reader).
Объекты-читатели имеют следующие публичные атрибуты:
-
csvreader.dialect -
Только для чтения описание диалекта, используемого анализатором.
-
csvreader.line_num -
Количество строк, прочитанных из итерируемого источника. Это не то же самое, что количество записей, так как записи могут занимать несколько строк.
Объекты DictReader имеют следующий публичный атрибут:
-
csvreader.fieldnames -
Если при создании объекта не передано в качестве параметра, этот атрибут инициализируется при первом доступе или при чтении первой записи из файла.
14.1.4. Объекты-писатели
Объекты Writer (DictWriter и объекты, возвращаемые функцией writer()) имеют следующие публичные методы. Строка должна быть итерируемым объектом строк или чисел для объектов Writer и словарем, сопоставляющим имена полей со строками или числами (сначала проходя через str()) для объектов DictWriter. Обратите внимание, что комплексные числа записываются в скобках. Это может вызвать некоторые проблемы для других программ, которые читают CSV-файлы (если они вообще поддерживают комплексные числа).
-
csvwriter.writerow(row) -
Записывает параметр строка в объект файла писателя, отформатированный в соответствии с текущим диалектом.
Изменено в версии 3.5: Добавлена поддержка произвольных итерируемых объектов.
-
csvwriter.writerows(rows) -
Записывает все элементы в rows (итерируемый объект объектов строки, как описано выше) в объект файла писателя, отформатированный в соответствии с текущим диалектом.
Объекты-писатели имеют следующий публичный атрибут:
-
csvwriter.dialect -
Только для чтения описание диалекта, используемого писателем.
Объекты DictWriter имеют следующий публичный метод:
-
DictWriter.writeheader() -
Записывает строку с именами полей (как указано в конструкторе).
Введено в версии 3.2.
14.1.5. Примеры
Самый простой пример чтения 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)
То же самое относится к записи в кодировке, отличной от системной по умолчанию: укажите аргумент encoding при открытии выходного файла.
Регистрация нового диалекта:
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.6/library/csv.html