Содержание страницы
14.1. csv – чтение и запись CSV-файлов¶csv – CSV File Reading and Writing
Так называемый формат 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, в котором было предложено это дополнение.
14.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)¶
Создаёт объект, который работает как обычный читатель, но сопоставляет прочитанную информацию со словарём, ключи которого задаются необязательным параметром fieldnames. Параметр fieldnames представляет собой последовательность, элементы которой последовательно сопоставляются с полями входных данных. Эти элементы становятся ключами результирующего словаря. Если параметр fieldnames опущен, в качестве имён полей используются значения первой строки csvfile. Если прочитанная строка содержит больше полей, чем последовательность fieldnames, оставшиеся данные добавляются в виде последовательности, ключом которой служит значение restkey. Если прочитанная строка содержит меньше полей, чем последовательность fieldnames, оставшимся ключам присваивается значение необязательного параметра restval. Любые другие необязательные или именованные аргументы передаются базовому экземпляру reader.
- class csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)¶
Создаёт объект, который работает как обычный записыватель, но преобразует словари в выходные строки. Параметр 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 предоставляет два метода:
Пример использования 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_MINIMAL¶
Указывает объектам writer заключать в кавычки только те поля, которые содержат специальные символы, такие как delimiter, quotechar или любые символы из lineterminator.
- csv.QUOTE_NONNUMERIC¶
Указывает объектам writer заключать в кавычки все нечисловые поля.
Указывает объекту чтения преобразовывать все нецитируемые поля в тип float.
- csv.QUOTE_NONE¶
Указывает объектам writer никогда не заключать поля в кавычки. Когда текущий delimiter встречается в выходных данных, перед ним ставится текущий символ escapechar. Если escapechar не задан, writer вызовет Error, если будут встречены символы, требующие экранирования.
Указывает объектам reader не выполнять никакой специальной обработки символов кавычек.
Модуль csv определяет следующее исключение:
- exception csv.Error¶
Возбуждается любой из функций при обнаружении ошибки.
14.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.
14.1.3. Объекты Reader¶Reader Objects
Объекты-читатели (экземпляры DictReader и объекты, возвращаемые функцией reader()) имеют следующие открытые методы:
- csvreader.__next__()¶
Возвращает следующую строку итерируемого объекта читателя в виде списка, разобранную в соответствии с текущим диалектом. Обычно следует вызывать это как next(reader).
Объекты reader имеют следующие открытые атрибуты:
- csvreader.dialect¶
Доступное только для чтения описание диалекта, используемого синтаксическим анализатором.
- csvreader.line_num¶
Количество строк, прочитанных из итератора-источника. Это число не совпадает с количеством возвращённых записей, так как записи могут занимать несколько строк.
Объекты DictReader имеют следующий открытый атрибут:
- csvreader.fieldnames¶
Если этот атрибут не был передан в качестве параметра при создании объекта, он инициализируется при первом обращении или при чтении первой записи из файла.
14.1.4. Объекты Writer¶Writer 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.
14.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 выполняет собственную обработку символов новой строки (универсальную). |