Документация Python неофициальный перевод

csv.md

469 строк · 40.8 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.16/library/csv.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `csv` – чтение и запись CSV-файлов89**Исходный код:** [Lib/csv.py](https://python-all.ru/src/main/Lib/csv.py)1011---1213Так называемый формат CSV (Comma Separated Values) – самый распространенный формат импорта и экспорта для электронных таблиц и баз данных. Формат CSV использовался много лет до попыток дать ему стандартизированное описание в [**RFC 4180**](https://python-all.ru/3.16/library/csv.html). Отсутствие четкого стандарта приводит к тому, что в данных, создаваемых и используемых разными приложениями, часто встречаются незначительные различия. Из-за этих различий обработка CSV-файлов из разных источников может быть утомительной. Тем не менее, хотя разделители и символы кавычек различаются, общий формат достаточно схож, чтобы можно было написать один модуль, способный эффективно работать с такими данными, скрывая от программиста детали чтения и записи.1415Модуль `csv` реализует классы для чтения и записи табличных данных в формате CSV. Он позволяет программистам сказать: «запиши эти данные в формате, предпочитаемом Excel» или «прочитай данные из этого файла, созданного Excel», не вдаваясь в точные детали формата CSV, используемого Excel. Программисты также могут описывать форматы CSV, используемые другими приложениями, или определять собственные специализированные форматы CSV.1617Объекты [`reader`](https://python-all.ru/3.16/library/csv.html#csv.reader) и [`writer`](https://python-all.ru/3.16/library/csv.html#csv.writer) модуля `csv` читают и записывают последовательности. Программисты также могут читать и записывать данные в словарной форме, используя классы [`DictReader`](https://python-all.ru/3.16/library/csv.html#csv.DictReader) и [`DictWriter`](https://python-all.ru/3.16/library/csv.html#csv.DictWriter).1819> **См. также**20>21> **[**PEP 305**](https://python-all.ru/3.16/library/csv.html) - API для CSV-файлов**22>23> Предложение по улучшению Python, в котором было предложено это дополнение.2425## Содержимое модуля2627Модуль `csv` определяет следующие функции:2829#### `csv.reader(csvfile, /, dialect='excel', **fmtparams)`3031Возвращает [объект reader](https://python-all.ru/3.16/library/csv.html#reader-objects), который будет обрабатывать строки из заданного *csvfile*. csvfile должен быть итерируемым объектом строк, каждая из которых соответствует формату CSV, определенному в reader. Обычно csvfile – это файлоподобный объект или список. Если *csvfile* является файловым объектом, он должен быть открыт с помощью `newline=''`. [\[1\]](https://python-all.ru/3.16/library/csv.html#id4) Необязательный параметр *dialect* можно задать для определения набора параметров, специфичных для конкретного диалекта CSV. Это может быть экземпляр подкласса класса [`Dialect`](https://python-all.ru/3.16/library/csv.html#csv.Dialect) или одна из строк, возвращаемых функцией [`list_dialects()`](https://python-all.ru/3.16/library/csv.html#csv.list_dialects). Другие необязательные ключевые аргументы *fmtparams* можно передать для переопределения отдельных параметров форматирования в текущем диалекте. Полные сведения о диалектах и параметрах форматирования см. в разделе [Диалекты и параметры форматирования](https://python-all.ru/3.16/library/csv.html#csv-fmt-params).3233Каждая строка, прочитанная из CSV-файла, возвращается в виде списка строк. Автоматическое преобразование типов данных не выполняется, если не задан параметр формата [`QUOTE_NONNUMERIC`](https://python-all.ru/3.16/library/csv.html#csv.QUOTE_NONNUMERIC) (в этом случае незакавыченные поля преобразуются в числа с плавающей запятой).3435Краткий пример использования:3637```python38>>> import csv39>>> with open('eggs.csv', newline='') as csvfile:40...     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')41...     for row in spamreader:42...         print(', '.join(row))43Spam, Spam, Spam, Spam, Spam, Baked Beans44Spam, Lovely Spam, Wonderful Spam45```4647где `eggs.csv` содержит:4849```text50Spam Spam Spam Spam Spam |Baked Beans|51Spam |Lovely Spam| |Wonderful Spam|52```5354#### `csv.writer(csvfile, /, dialect='excel', **fmtparams)`5556Возвращает объект writer, отвечающий за преобразование данных пользователя в строки с разделителями и запись в заданный файлоподобный объект. *csvfile* может быть любым объектом с методом [`write()`](https://python-all.ru/3.16/library/io.html#io.TextIOBase.write). Если *csvfile* является файловым объектом, он должен быть открыт с помощью `newline=''` [\[1\]](https://python-all.ru/3.16/library/csv.html#id4). Необязательный параметр *dialect* может быть задан для определения набора параметров, специфичных для конкретного диалекта CSV. Это может быть экземпляр подкласса класса [`Dialect`](https://python-all.ru/3.16/library/csv.html#csv.Dialect) или одна из строк, возвращаемых функцией [`list_dialects()`](https://python-all.ru/3.16/library/csv.html#csv.list_dialects). Другие необязательные ключевые аргументы *fmtparams* можно передать для переопределения отдельных параметров форматирования в текущем диалекте. Полные сведения о диалектах и параметрах форматирования см. в разделе [Диалекты и параметры форматирования](https://python-all.ru/3.16/library/csv.html#csv-fmt-params). Чтобы обеспечить максимально простую интеграцию с модулями, реализующими DB API, значение [`None`](https://python-all.ru/3.16/library/constants.html#None) записывается как пустая строка. Хотя это необратимое преобразование, оно упрощает выгрузку значений SQL NULL в CSV-файлы без предварительной обработки данных, возвращаемых вызовом `cursor.fetch*`. Все остальные нестроковые данные преобразуются в строки с помощью [`str()`](https://python-all.ru/3.16/library/stdtypes.html#str) перед записью.5758Краткий пример использования:5960```python61import csv62with open('eggs.csv', 'w', newline='') as csvfile:63    spamwriter = csv.writer(csvfile, delimiter=' ',64                            quotechar='|', quoting=csv.QUOTE_MINIMAL)65    spamwriter.writerow(['Spam'] * 5 + ['Baked Beans'])66    spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])67```6869который записывает `eggs.csv`, содержащий:7071```text72Spam Spam Spam Spam Spam |Baked Beans|73Spam |Lovely Spam| |Wonderful Spam|74```7576#### `csv.register_dialect(name, /, dialect='excel', **fmtparams)`7778Связывает *dialect* с *name*. *name* должен быть строкой. Диалект можно задать, передав подкласс [`Dialect`](https://python-all.ru/3.16/library/csv.html#csv.Dialect), или с помощью ключевых аргументов *fmtparams*, или того и другого; при этом ключевые аргументы переопределяют параметры диалекта. Полные сведения о диалектах и параметрах форматирования см. в разделе [Диалекты и параметры форматирования](https://python-all.ru/3.16/library/csv.html#csv-fmt-params).7980#### `csv.unregister_dialect(name)`8182Удаляет диалект, связанный с *name*, из реестра диалектов. Возникает исключение [`Error`](https://python-all.ru/3.16/library/csv.html#csv.Error), если *name* не является зарегистрированным именем диалекта.8384#### `csv.get_dialect(name)`8586Возвращает диалект, связанный с *name*. Возникает исключение [`Error`](https://python-all.ru/3.16/library/csv.html#csv.Error), если *name* не является зарегистрированным именем диалекта. Эта функция возвращает неизменяемый [`Dialect`](https://python-all.ru/3.16/library/csv.html#csv.Dialect).8788#### `csv.list_dialects()`8990Возвращает имена всех зарегистрированных диалектов.9192#### `csv.field_size_limit()`9394#### `csv.field_size_limit(new_limit)`9596Возвращает текущий максимальный размер поля, разрешенный парсером. Если задан *new\_limit*, он становится новым лимитом.9798Модуль `csv` определяет следующие классы:99100#### `class csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)`101102Создает объект, который работает как обычный reader, но сопоставляет информацию из каждой строки с [`dict`](https://python-all.ru/3.16/library/stdtypes.html#dict), ключи которого задаются необязательным параметром *fieldnames*.103104Параметр *fieldnames* – это [последовательность](https://python-all.ru/3.16/glossary.html#term-sequence). Если *fieldnames* опущен, в качестве имён полей используются значения из первой строки файла *f*, и они не включаются в результаты. Если *fieldnames* указан, то используются они, а первая строка включается в результаты. Независимо от того, как определены имена полей, словарь сохраняет их исходный порядок.105106Если в строке больше полей, чем имён полей, оставшиеся данные помещаются в список и сохраняются под именем поля, указанным в *restkey* (по умолчанию `None`). Если непустая строка содержит меньше полей, чем имён полей, недостающие значения заполняются значением *restval* (по умолчанию `None`).107108Все остальные необязательные и именованные аргументы передаются базовому экземпляру [`reader`](https://python-all.ru/3.16/library/csv.html#csv.reader).109110Если аргумент, переданный в *fieldnames*, является итератором, он будет преобразован в [`list`](https://python-all.ru/3.16/library/stdtypes.html#list).111112Изменено в версии 3.6: Возвращаемые строки теперь имеют тип `OrderedDict`.113114Изменено в версии 3.8: Возвращаемые строки теперь имеют тип [`dict`](https://python-all.ru/3.16/library/stdtypes.html#dict).115116Краткий пример использования:117118```python119>>> import csv120>>> with open('names.csv', newline='') as csvfile:121...     reader = csv.DictReader(csvfile)122...     for row in reader:123...         print(row['first_name'], row['last_name'])124...125Eric Idle126John Cleese127128>>> print(row)129{'first_name': 'John', 'last_name': 'Cleese'}130```131132где `names.csv` содержит:133134```text135first_name,last_name136Eric,Idle137John,Cleese138```139140#### `class csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)`141142Создаёт объект, который работает как обычный writer, но отображает словари на выходные строки. Параметр *fieldnames* – это [`sequence`](https://python-all.ru/3.16/library/collections.abc.html#module-collections.abc) ключей, определяющих порядок, в котором значения из словаря, переданного методу [`writerow()`](https://python-all.ru/3.16/library/csv.html#csv.csvwriter.writerow), записываются в файл *f*. Необязательный параметр *restval* задаёт значение, которое будет записано, если в словаре отсутствует ключ из *fieldnames*. Если словарь, переданный методу `writerow()`, содержит ключ, отсутствующий в *fieldnames*, необязательный параметр *extrasaction* указывает, какие действия предпринять. Если он установлен в `'raise'` (значение по умолчанию), возбуждается [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError). Если он установлен в `'ignore'`, дополнительные значения в словаре игнорируются. Все остальные необязательные и именованные аргументы передаются базовому экземпляру [`writer`](https://python-all.ru/3.16/library/csv.html#csv.writer).143144Обратите внимание, что в отличие от класса [`DictReader`](https://python-all.ru/3.16/library/csv.html#csv.DictReader), параметр *fieldnames* класса `DictWriter` не является необязательным.145146Если аргумент, переданный в *fieldnames*, является итератором, он будет преобразован в [`list`](https://python-all.ru/3.16/library/stdtypes.html#list).147148Краткий пример использования:149150```python151import csv152153with open('names.csv', 'w', newline='') as csvfile:154    fieldnames = ['first_name', 'last_name']155    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)156157    writer.writeheader()158    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})159    writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})160    writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})161```162163который записывает `names.csv`, содержащий:164165```text166first_name,last_name167Baked,Beans168Lovely,Spam169Wonderful,Spam170```171172#### `class csv.Dialect`173174Класс `Dialect` – это класс-контейнер, атрибуты которого содержат информацию о том, как обрабатывать двойные кавычки, пробелы, разделители и т.д. Из-за отсутствия строгой спецификации CSV разные приложения создают незначительно различающиеся CSV-данные. Экземпляры `Dialect` определяют поведение экземпляров [`reader`](https://python-all.ru/3.16/library/csv.html#csv.reader) и [`writer`](https://python-all.ru/3.16/library/csv.html#csv.writer).175176Все доступные имена `Dialect` возвращаются функцией [`list_dialects()`](https://python-all.ru/3.16/library/csv.html#csv.list_dialects), и их можно зарегистрировать для конкретных классов [`reader`](https://python-all.ru/3.16/library/csv.html#csv.reader) и [`writer`](https://python-all.ru/3.16/library/csv.html#csv.writer) через их функции инициализации (`__init__`), например:177178```python179import csv180181with open('students.csv', 'w', newline='') as csvfile:182    writer = csv.writer(csvfile, dialect='unix')183```184185#### `class csv.excel`186187Класс `excel` определяет обычные свойства CSV-файла, созданного в Excel. Он зарегистрирован под именем диалекта `'excel'`.188189#### `class csv.excel_tab`190191Класс `excel_tab` определяет обычные свойства файла с разделителями табуляции, созданного в Excel. Он зарегистрирован под именем диалекта `'excel-tab'`.192193#### `class csv.unix_dialect`194195Класс `unix_dialect` определяет обычные свойства CSV-файла, созданного в UNIX-системах, то есть использующего `'\n'` в качестве завершителя строк и заключающего все поля в кавычки. Он зарегистрирован под именем диалекта `'unix'`.196197Добавлено в версии 3.2.198199#### `class csv.Sniffer`200201Класс `Sniffer` используется для определения формата CSV-файла.202203Класс `Sniffer` предоставляет два метода:204205#### `sniff(sample, delimiters=None)`206207Анализирует переданный *sample* и возвращает подкласс [`Dialect`](https://python-all.ru/3.16/library/csv.html#csv.Dialect), отражающий найденные параметры. Если указан необязательный параметр *delimiters*, он интерпретируется как строка, содержащая возможные допустимые символы-разделители.208209#### `has_header(sample)`210211Анализирует образец текста (предположительно в формате CSV) и возвращает [`True`](https://python-all.ru/3.16/library/constants.html#True), если первая строка выглядит как набор заголовков столбцов. При проверке каждого столбца учитывается один из двух ключевых критериев для оценки, содержит ли образец заголовок:212213- со второй по n-ю строки содержат числовые значения.214- со второй по n-ю строки содержат строки, где длина хотя бы одного значения отличается от длины предполагаемого заголовка этого столбца.215216После заголовка выбирается двадцать одна строка; если более половины столбцов + строк удовлетворяют критериям, возвращается [`True`](https://python-all.ru/3.16/library/constants.html#True).217218> **Примечание**219>220> Этот метод является грубой эвристикой и может давать как ложноположительные, так и ложноотрицательные результаты.221222Пример использования [`Sniffer`](https://python-all.ru/3.16/library/csv.html#csv.Sniffer):223224```python225with open('example.csv', newline='') as csvfile:226    dialect = csv.Sniffer().sniff(csvfile.read(1024))227    csvfile.seek(0)228    reader = csv.reader(csvfile, dialect)229    # ... здесь обрабатывается содержимое CSV-файла ...230```231232Модуль `csv` определяет следующие константы:233234#### `csv.QUOTE_ALL`235236Указывает объектам [`writer`](https://python-all.ru/3.16/library/csv.html#csv.writer) заключать все поля в кавычки.237238#### `csv.QUOTE_MINIMAL`239240Указывает объектам [`writer`](https://python-all.ru/3.16/library/csv.html#csv.writer) заключать в кавычки только те поля, которые содержат специальные символы, такие как *разделитель*, *символ кавычек*, `'\r'`, `'\n'` или любой из символов в *терминаторе строки*.241242#### `csv.QUOTE_NONNUMERIC`243244Указывает объектам [`writer`](https://python-all.ru/3.16/library/csv.html#csv.writer) заключать все нечисловые поля в кавычки.245246Указывает объектам [`reader`](https://python-all.ru/3.16/library/csv.html#csv.reader) преобразовывать все незаключённые в кавычки поля в тип [`float`](https://python-all.ru/3.16/library/functions.html#float).247248> **Примечание**249>250> Некоторые числовые типы, такие как [`bool`](https://python-all.ru/3.16/library/functions.html#bool), [`Fraction`](https://python-all.ru/3.16/library/fractions.html#fractions.Fraction), или [`IntEnum`](https://python-all.ru/3.16/library/enum.html#enum.IntEnum), имеют строковое представление, которое не может быть преобразовано в [`float`](https://python-all.ru/3.16/library/functions.html#float). Их нельзя прочитать в режимах `QUOTE_NONNUMERIC` и [`QUOTE_STRINGS`](https://python-all.ru/3.16/library/csv.html#csv.QUOTE_STRINGS).251252#### `csv.QUOTE_NONE`253254Указывает объектам [`writer`](https://python-all.ru/3.16/library/csv.html#csv.writer) никогда не заключать поля в кавычки. Если текущие *разделитель*, *символ кавычек*, *символ экранирования*, `'\r'`, `'\n'` или любой из символов в *терминаторе строки* встречаются в выходных данных, они предваряются текущим символом *escapechar*. Если *escapechar* не задан, записывающий объект возбудит исключение [`Error`](https://python-all.ru/3.16/library/csv.html#csv.Error), если будут обнаружены символы, требующие экранирования. Установите *символ кавычек* в `None`, чтобы предотвратить их экранирование.255256Указывает объектам [`reader`](https://python-all.ru/3.16/library/csv.html#csv.reader) не выполнять специальную обработку символов кавычек.257258#### `csv.QUOTE_NOTNULL`259260Указывает объектам [`writer`](https://python-all.ru/3.16/library/csv.html#csv.writer) заключать в кавычки все поля, которые не являются `None`. Это похоже на [`QUOTE_ALL`](https://python-all.ru/3.16/library/csv.html#csv.QUOTE_ALL), за исключением того, что если значение поля равно `None`, записывается пустая (незаключённая в кавычки) строка.261262Указывает объектам [`reader`](https://python-all.ru/3.16/library/csv.html#csv.reader) интерпретировать пустое (незаключённое в кавычки) поле как `None`, а в остальном вести себя как [`QUOTE_ALL`](https://python-all.ru/3.16/library/csv.html#csv.QUOTE_ALL).263264Добавлено в версии 3.12.265266#### `csv.QUOTE_STRINGS`267268Указывает объектам [`writer`](https://python-all.ru/3.16/library/csv.html#csv.writer) всегда заключать в кавычки поля, являющиеся строками. Это похоже на [`QUOTE_NONNUMERIC`](https://python-all.ru/3.16/library/csv.html#csv.QUOTE_NONNUMERIC), за исключением того, что если значение поля равно `None`, записывается пустая (незаключённая в кавычки) строка.269270Указывает объектам [`reader`](https://python-all.ru/3.16/library/csv.html#csv.reader) интерпретировать пустую (незаключённую в кавычки) строку как `None`, а в остальном вести себя как [`QUOTE_NONNUMERIC`](https://python-all.ru/3.16/library/csv.html#csv.QUOTE_NONNUMERIC).271272Добавлено в версии 3.12.273274Модуль `csv` определяет следующее исключение:275276#### `exception csv.Error`277278Возбуждается любой из функций при обнаружении ошибки.279280## Диалекты и параметры форматирования281282Чтобы упростить задание формата входных и выходных записей, определённые параметры форматирования группируются в диалекты. Диалект представляет собой подкласс класса [`Dialect`](https://python-all.ru/3.16/library/csv.html#csv.Dialect), содержащий различные атрибуты, описывающие формат CSV-файла. При создании объектов [`reader`](https://python-all.ru/3.16/library/csv.html#csv.reader) или [`writer`](https://python-all.ru/3.16/library/csv.html#csv.writer) программист может указать строку или подкласс класса `Dialect` в качестве параметра диалекта. В дополнение к параметру *диалект* или вместо него программист также может указать отдельные параметры форматирования, имена которых совпадают с атрибутами, определёнными ниже для класса `Dialect`.283284Диалекты поддерживают следующие атрибуты:285286#### `Dialect.delimiter`287288Односимвольная строка, используемая для разделения полей. По умолчанию равна `','`.289290#### `Dialect.doublequote`291292Управляет тем, как должны заключаться в кавычки экземпляры *quotechar*, встречающиеся внутри поля. Когда [`True`](https://python-all.ru/3.16/library/constants.html#True), символ удваивается. Когда [`False`](https://python-all.ru/3.16/library/constants.html#False), *escapechar* используется в качестве префикса для *quotechar*. По умолчанию `True`.293294При выводе, если *doublequote* равно [`False`](https://python-all.ru/3.16/library/constants.html#False) и *escapechar* не задан, возбуждается [`Error`](https://python-all.ru/3.16/library/csv.html#csv.Error), если в поле обнаружен *quotechar*.295296#### `Dialect.escapechar`297298Односимвольная строка, используемая writer для экранирования символов, требующих экранирования:299300> - символ *delimiter*, *quotechar*, `'\r'`, `'\n'` и любой символ из *lineterminator* экранируются, если *quoting* установлен в [`QUOTE_NONE`](https://python-all.ru/3.16/library/csv.html#csv.QUOTE_NONE);301> - символ *quotechar* экранируется, если *doublequote* равен [`False`](https://python-all.ru/3.16/library/constants.html#False);302> - сам символ *escapechar*.303304При чтении символ *escapechar* снимает специальное значение со следующего символа. По умолчанию равен [`None`](https://python-all.ru/3.16/library/constants.html#None), что отключает экранирование.305306Изменено в версии 3.11: Пустое значение *escapechar* не допускается.307308#### `Dialect.lineterminator`309310Строка, используемая для завершения строк, создаваемых [`writer`](https://python-all.ru/3.16/library/csv.html#csv.writer). По умолчанию равна `'\r\n'`.311312> **Примечание**313>314> Модуль [`reader`](https://python-all.ru/3.16/library/csv.html#csv.reader) жёстко запрограммирован распознавать `'\r'` или `'\n'` как конец строки и игнорировать *lineterminator*. В будущем это поведение может измениться.315316#### `Dialect.quotechar`317318Односимвольная строка, используемая для заключения в кавычки полей, содержащих специальные символы, такие как *delimiter* или *quotechar*, или содержащих символы новой строки (`'\r'`, `'\n'` или любой символ из *lineterminator*). По умолчанию равна `'"'`. Может быть установлена в `None`, чтобы предотвратить экранирование `'"'`, если *quoting* установлен в [`QUOTE_NONE`](https://python-all.ru/3.16/library/csv.html#csv.QUOTE_NONE).319320Изменено в версии 3.11: Пустое значение *quotechar* не допускается.321322#### `Dialect.quoting`323324Управляет тем, когда writer должен генерировать кавычки, а reader – распознавать их. Может принимать любое из [констант QUOTE\_\*](https://python-all.ru/3.16/library/csv.html#csv-constants) и по умолчанию равен [`QUOTE_MINIMAL`](https://python-all.ru/3.16/library/csv.html#csv.QUOTE_MINIMAL), если *quotechar* не равен `None`, иначе [`QUOTE_NONE`](https://python-all.ru/3.16/library/csv.html#csv.QUOTE_NONE).325326#### `Dialect.skipinitialspace`327328Если [`True`](https://python-all.ru/3.16/library/constants.html#True), пробелы, следующие сразу за *delimiter*, игнорируются. По умолчанию [`False`](https://python-all.ru/3.16/library/constants.html#False). При совместном использовании `delimiter=' '` и `skipinitialspace=True` пустые поля без кавычек не допускаются.329330#### `Dialect.strict`331332Если `True`, при некорректном CSV-вводе вызывается исключение [`Error`](https://python-all.ru/3.16/library/csv.html#csv.Error). По умолчанию `False`.333334## Объекты Reader335336Объекты reader (экземпляры [`DictReader`](https://python-all.ru/3.16/library/csv.html#csv.DictReader) и объекты, возвращаемые функцией [`reader()`](https://python-all.ru/3.16/library/csv.html#csv.reader)) имеют следующие открытые методы:337338#### `csvreader.__next__()`339340Возвращает следующую строку итерируемого объекта reader в виде списка (если объект был возвращён из [`reader()`](https://python-all.ru/3.16/library/csv.html#csv.reader)) или словаря (если это экземпляр [`DictReader`](https://python-all.ru/3.16/library/csv.html#csv.DictReader)), разобранную в соответствии с текущим [`Dialect`](https://python-all.ru/3.16/library/csv.html#csv.Dialect). Обычно это вызывается как `next(reader)`.341342Объекты reader имеют следующие открытые атрибуты:343344#### `csvreader.dialect`345346Доступное только для чтения описание диалекта, используемого синтаксическим анализатором.347348#### `csvreader.line_num`349350Количество строк, прочитанных из итератора-источника. Это число не совпадает с количеством возвращённых записей, так как записи могут занимать несколько строк.351352Объекты DictReader имеют следующий открытый атрибут:353354#### `DictReader.fieldnames`355356Если этот атрибут не был передан в качестве параметра при создании объекта, он инициализируется при первом обращении или при чтении первой записи из файла.357358## Объекты Writer359360Объекты [`writer`](https://python-all.ru/3.16/library/csv.html#csv.writer) (экземпляры [`DictWriter`](https://python-all.ru/3.16/library/csv.html#csv.DictWriter) и объекты, возвращаемые функцией [`writer()`](https://python-all.ru/3.16/library/csv.html#csv.writer)) имеют следующие открытые методы. Параметр *row* должен быть итерацией строк или чисел для объектов `writer` и словарём, сопоставляющим имена полей со строками или числами (предварительно пропустив их через [`str()`](https://python-all.ru/3.16/library/stdtypes.html#str)) для объектов `DictWriter`. Обратите внимание, что комплексные числа записываются в круглых скобках. Это может вызвать некоторые проблемы для других программ, читающих CSV-файлы (если они вообще поддерживают комплексные числа).361362#### `csvwriter.writerow(row, /)`363364Записывает параметр *row* в файловый объекта средства записи, форматируя в соответствии с текущим [`Dialect`](https://python-all.ru/3.16/library/csv.html#csv.Dialect). Возвращает значение, возвращённое вызовом метода *write* базового файлового объекта.365366Изменено в версии 3.5: Добавлена поддержка произвольных итераций.367368#### `csvwriter.writerows(rows, /)`369370Записывает все элементы из *rows* (итерацию объектов *row*, как описано выше) в файловый объекта средства записи, форматируя в соответствии с текущим диалектом.371372Объекты Writer имеют следующий открытый атрибут:373374#### `csvwriter.dialect`375376Описание диалекта, используемого средством записи, доступное только для чтения.377378Объекты DictWriter имеют следующий открытый метод:379380#### `DictWriter.writeheader()`381382Записывает строку с именами полей (как указано в конструкторе) в файловый объекта средства записи, форматируя в соответствии с текущим диалектом. Возвращает значение, возвращённое внутренним вызовом [`csvwriter.writerow()`](https://python-all.ru/3.16/library/csv.html#csv.csvwriter.writerow).383384Добавлено в версии 3.2.385386Изменено в версии 3.8: `writeheader()` теперь также возвращает значение, возвращаемое используемым внутренне методом [`csvwriter.writerow()`](https://python-all.ru/3.16/library/csv.html#csv.csvwriter.writerow).387388## Примеры389390Простейший пример чтения CSV-файла:391392```python393import csv394with open('some.csv', newline='') as f:395    reader = csv.reader(f)396    for row in reader:397        print(row)398```399400Чтение файла в альтернативном формате:401402```python403import csv404with open('passwd', newline='') as f:405    reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)406    for row in reader:407        print(row)408```409410Соответствующий простейший пример записи:411412```python413import csv414with open('some.csv', 'w', newline='') as f:415    writer = csv.writer(f)416    writer.writerows(someiterable)417```418419Поскольку [`open()`](https://python-all.ru/3.16/library/functions.html#open) используется для открытия CSV-файла для чтения, файл по умолчанию будет декодирован в Unicode с использованием системной кодировки по умолчанию (см. [`locale.getencoding()`](https://python-all.ru/3.16/library/locale.html#locale.getencoding)). Чтобы декодировать файл с другой кодировкой, используйте аргумент `encoding` функции open:420421```python422import csv423with open('some.csv', newline='', encoding='utf-8') as f:424    reader = csv.reader(f)425    for row in reader:426        print(row)427```428429То же самое относится к записи в кодировке, отличной от системной: укажите аргумент encoding при открытии выходного файла.430431Регистрация нового диалекта:432433```python434import csv435csv.register_dialect('unixpwd', delimiter=':', quoting=csv.QUOTE_NONE)436with open('passwd', newline='') as f:437    reader = csv.reader(f, 'unixpwd')438```439440Чуть более продвинутое использование reader – перехват и сообщение об ошибках:441442```python443import csv, sys444filename = 'some.csv'445with open(filename, newline='') as f:446    reader = csv.reader(f)447    try:448        for row in reader:449            print(row)450    except csv.Error as e:451        sys.exit(f'file {filename}, line {reader.line_num}: {e}')452```453454И хотя модуль напрямую не поддерживает разбор строк, это можно легко сделать:455456```python457import csv458for row in csv.reader(['one,two,three']):459    print(row)460```461462Сноски463464\[1\]465466([1](https://python-all.ru/3.16/library/csv.html#id1),[2](https://python-all.ru/3.16/library/csv.html#id2))467468Если `newline=''` не указан, символы новой строки, встроенные внутри полей в кавычках, не будут интерпретироваться правильно, а на платформах, использующих окончания строк `\r\n`, при записи будет добавлен лишний `\r`. Всегда безопасно указывать `newline=''`, поскольку модуль csv выполняет собственную ([универсальную](https://python-all.ru/3.16/glossary.html#term-universal-newlines)) обработку символов новой строки.469