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) -
Возвращает объект-чтец, который будет итерироваться по строкам в заданном файле 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) -
Создаёт объект, который работает как обычный читатель, но отображает информацию в каждой строке в словарь
dict, ключи которого задаются необязательным параметром fieldnames.Параметр fieldnames — это последовательность. Если fieldnames опущено, значения в первой строке файла f будут использованы в качестве имён полей. Независимо от того, как определяются имена полей, словарь сохраняет их исходный порядок.
Если строка содержит больше полей, чем имён полей, оставшиеся данные помещаются в список и хранятся с именем поля, указанным параметром restkey (по умолчанию
None). Если в ненулевой строке меньше полей, чем имён полей, пропущенные значения заполняются значением restval (по умолчаниюNone).Все остальные необязательные или ключевые аргументы передаются в базовом объекте
reader.Изменено в версии 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) -
Создаёт объект, который работает как обычный писатель, но отображает словари на строки вывода. Параметр fieldnames — это последовательность ключей, которые определяют порядок записи значений в словаре, передаваемом методу
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цитировать только те поля, которые содержат специальные символы, такие как разделитель, символ_цитаты или любые символы из 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 -
Односимвольная строка, используемая писателем для экранирования разделителя, если цитирование установлено в
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) -
Записать параметр строка в файл объекта записывателя, отформатированный в соответствии с текущим диалектом. Вернуть значение, возвращаемое методом write подлежащего объекта файла.
Изменено в версии 3.5: Добавлена поддержка произвольных итерируемых объектов.
-
csvwriter.writerows(rows) -
Записать все элементы в строки (итерируемый объект объектов строка, как описано выше) в файл объекта записывателя, отформатированный в соответствии с текущим диалектом.
Объекты записывателя имеют следующее публичное атрибут:
-
csvwriter.dialect -
Только для чтения описание диалекта, используемого записывателем.
Объекты DictWriter имеют следующий публичный метод:
-
DictWriter.writeheader() -
Записать строку с именами полей (как указано в конструкторе) в файл объекта записывателя, отформатированный в соответствии с текущим диалектом. Возвратить значение, возвращаемое вызовом
csvwriter.writerow(), используемым внутри.Введено в версии 3.2.
Изменено в версии 3.8:
writeheader()теперь также возвращает значение, возвращаемое методомcsvwriter.writerow(), используемым им внутри.
Примеры
Самый простой пример чтения 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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/csv.html