Как читать и писать CSV-файлы в Python
Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)
Формат CSV является наиболее часто используемым форматом импорта и экспорта для баз данных и электронных таблиц. В этом руководстве будет подробно рассказано о CSV, а также о модулях и классах, доступных для чтения и записи данных в файлы CSV. Также будет рассмотрен рабочий пример, показывающий, как читать и записывать данные в файл CSV на Python.
Что такое файл CSV?
Модули для чтения и записи
Модуль CSV имеет несколько функций и классов, доступных для чтения и записи CSV, и они включают в себя:
csv.reader
Модуль csv.reader принимает следующие параметры:
Вот пример того, как использовать модуль csv.reader.
модуль csv.writer
Этот модуль похож на модуль csv.reader и используется для записи данных в CSV. Требуется три параметра:
Классы DictReader и DictWriter
DictReader
DictWriter
Этот класс аналогичен классу DictWriter и выполняет противоположную функцию: запись данных в файл CSV. Класс определяется как csv.DictWriter(csvfile, fieldnames,restval=», extrasaction=’raise’,dialect=’excel’, *args, **kwds)
Параметр fieldnames определяет последовательность ключей, которые определяют порядок, в котором значения в словаре записываются в файл CSV. В отличие от DictReader, этот ключ не является обязательным и должен быть определен во избежание ошибок при записи в CSV.
Диалекты и форматирование
Есть несколько атрибутов, которые поддерживаются диалектом:
Чтение файла CSV
Давайте посмотрим, как читать CSV-файл, используя вспомогательные модули, которые мы обсуждали выше.

Чтение CSV-файла с помощью csv.reader
Мы показываем прочитанные данные, печатая их содержимое на консоль. Мы также указали обязательные параметры, такие как разделитель, кавычка и цитирование.
Вывод
Чтение CSV-файла с помощью DictReader
Вот как читать CSV, используя класс DictWriter.
Наконец, мы добавляем каждую строку в список результатов и выводим содержимое на консоль.
Вывод
Как вы можете видеть выше, лучше использовать класс DictReader, потому что он выдает наши данные в формате словаря, с которым легче работать.
Запись в файл CSV
Запись в файл CSV с помощью csv.writer
Вот наш CSV с данными, которые мы записали в него.

Запись в файл CSV с использованием DictWriter
Давайте напишем следующие данные в CSV.
Код, как показано ниже.
Вот как можно записать все строки одновременно.
Заключение
В этом руководстве рассматривается большинство вопросов, необходимых для успешного чтения и записи в файл CSV с использованием различных функций и классов, предоставляемых Python. Файлы CSV широко используются в приложениях, потому что их легко читать и управлять ими, а их небольшой размер делает их относительно быстрыми для обработки и передачи.
Не стесняйтесь, и посмотрите, что у нас есть для продажи и для изучения на рынке, и не стесняйтесь задавать любые вопросы и предоставить свой ценный отзыв, используя канал комментариев ниже.
CSV в Python
Программисты часто сталкиваются с задачей обработки больших объемов структурированных данных. Python имеет встроенную библиотеку CSV, с помощью которой программист может работать со специальными CSV файлами. Это своего рода электронные таблицы.
Что такое файлы CSV
Файл CSV – это особый вид файла, который позволяет структурировать большие объемы данных.
По сути, он является обычным текстовым файлом, однако каждый новый элемент отделен от предыдущего запятой или другим разделителем. Обычно каждая запись начинается с новой строки. Данные CSV можно легко экспортировать в электронные таблицы или базы данных. Программист может расширять CSV файл, добавляя новые строки.
Пример CSV файла, где в качестве разделителя используется запятая:
Вместо запятой можно использовать любой другой разделитель, поэтому при чтении CSV файла нужно заранее знать, какой символ используется.
Важно помнить, что CSV – это обычный текстовый файл, который не поддерживает символы в кодировках, отличающихся от ASCII или Unicode.
Библиотека CSV
Эта основная библиотека для работы с CSV файлами в Python.
Библиотека csv является встроенной, поэтому её не нужно скачивать, достаточно использовать обычный импорт:
Чтение из файлов (парсинг)
Для того чтобы прочитать данные из файла, программист должен создать объект reader:
Предположим, что у нас есть CSV файл, который содержит следующую информацию:
Тогда, если открыть этот файл в нашей программе, то будут получены следующие результаты:
Использование конструкции with…as позволяет программисту быть уверенным, что файл будет закрыт, даже если при выполнении кода произойдет какая-то ошибка.
Библиотека CSV позволяет работать с файлами, как со словарями, для этого нужно создать объект DictReader. Обращаться к элементам можно по имени столбцов, а не с помощью индексов. Для того, чтобы исходная программа делала аналогичный вывод, её следует изменить следующим образом:
Обратите внимание, что в цикл for при первой итерации будет записан в row не шапка таблицы, а первая её строка. Поэтому при выводе количества строк переменную count увеличили на 1.
Дополнительные параметры объекта DictReader
DictReader имеет параметры:
Например, если бы в classmates.csv не было бы первой строки с заголовками, то можно было бы его открыть следующим образом:
Также можно использовать метод __next__() для получения следующей строки. Этот метод делает объект reader итерируемым. То есть он вызывается при каждой итерации и возвращает следующую строку. Этот метод и используется при каждой итерации в цикле for для получения очередной строки.
Запись в файлы
Для записи информации в CSV файл необходимо создать объект writer:
Для записи в файл данных используется метод writerow(), который имеет следующий синтаксис:
Код программы для записи в CSV файл выглядит так:
После выполнения программы в файле CSV будет следующий текст:
В качестве параметра метод writerow() принимает список, элементы которого будут записаны в строку через символ-разделитель.
Запись в файл также может быть осуществлена с помощью объекта DictWriter. Важно помнить, что он требует явного указания параметра fieldnames. В качестве аргумента метода writerow используется словарь.
Код программы выглядит так:
Вывод в файл будет следующим:
Дополнительные параметры DictWriter
Объект writer также имеет атрибут dialect, который определяет, как будут форматироваться данные при записи в файл, про него будет описано ниже.
Кроме того, writer имеет методы:
writeheader был использован в предыдущем примере. Рассмотрим применение writerows :
Диалекты
Чтобы каждый раз не указывать формат входных и выходных данных, определенные параметры форматирования сгруппированы в диалекты (dialect). При создании объекта reader или writer программист может указать нужный ему диалект, кроме того, некоторые параметры диалекта можно переопределить вручную, также указав их при создании объекта.
Для создания диалекта используется команда:
Класс Dialect позволяет определить следующие атрибуты форматирования:
csv — CSV File Reading and Writing¶
Source code: Lib/csv.py
The so-called CSV (Comma Separated Values) format is the most common import and export format for spreadsheets and databases. CSV format was used for many years prior to attempts to describe the format in a standardized way in RFC 4180. The lack of a well-defined standard means that subtle differences often exist in the data produced and consumed by different applications. These differences can make it annoying to process CSV files from multiple sources. Still, while the delimiters and quoting characters vary, the overall format is similar enough that it is possible to write a single module which can efficiently manipulate such data, hiding the details of reading and writing the data from the programmer.
The csv module implements classes to read and write tabular data in CSV format. It allows programmers to say, “write this data in the format preferred by Excel,” or “read data from this file which was generated by Excel,” without knowing the precise details of the CSV format used by Excel. Programmers can also describe the CSV formats understood by other applications or define their own special-purpose CSV formats.
The csv module’s reader and writer objects read and write sequences. Programmers can also read and write data in dictionary form using the DictReader and DictWriter classes.
The Python Enhancement Proposal which proposed this addition to Python.
Module ContentsВ¶
The csv module defines the following functions:
csv. reader ( csvfile, dialect=’excel’, **fmtparams ) В¶
Each row read from the csv file is returned as a list of strings. No automatic data type conversion is performed unless the QUOTE_NONNUMERIC format option is specified (in which case unquoted fields are transformed into floats).
A short usage example:
Return a writer object responsible for converting the user’s data into delimited strings on the given file-like object. csvfile can be any object with a write() method. If csvfile is a file object, it should be opened with newline=» 1. An optional dialect parameter can be given which is used to define a set of parameters specific to a particular CSV dialect. It may be an instance of a subclass of the Dialect class or one of the strings returned by the list_dialects() function. The other optional fmtparams keyword arguments can be given to override individual formatting parameters in the current dialect. For full details about dialects and formatting parameters, see the Dialects and Formatting Parameters section. To make it as easy as possible to interface with modules which implement the DB API, the value None is written as the empty string. While this isn’t a reversible transformation, it makes it easier to dump SQL NULL data values to CSV files without preprocessing the data returned from a cursor.fetch* call. All other non-string data are stringified with str() before being written.
A short usage example:
csv. unregister_dialect ( name ) В¶
Delete the dialect associated with name from the dialect registry. An Error is raised if name is not a registered dialect name.
csv. get_dialect ( name ) В¶
Return the names of all registered dialects.
csv. field_size_limit ( [ new_limit ] ) В¶
Returns the current maximum field size allowed by the parser. If new_limit is given, this becomes the new limit.
The csv module defines the following classes:
class csv. DictReader ( f, fieldnames=None, restkey=None, restval=None, dialect=’excel’, *args, **kwds ) В¶
Create an object that operates like a regular reader but maps the information in each row to a dict whose keys are given by the optional fieldnames parameter.
If a row has more fields than fieldnames, the remaining data is put in a list and stored with the fieldname specified by restkey (which defaults to None ). If a non-blank row has fewer fields than fieldnames, the missing values are filled-in with the value of restval (which defaults to None ).
All other optional or keyword arguments are passed to the underlying reader instance.
A short usage example:
Note that unlike the DictReader class, the fieldnames parameter of the DictWriter class is not optional.
A short usage example:
The Dialect class is a container class whose attributes contain information for how to handle doublequotes, whitespace, delimiters, etc. Due to the lack of a strict CSV specification, different applications produce subtly different CSV data. Dialect instances define how reader and writer instances behave.
class csv. excel_tab В¶
class csv. unix_dialect В¶
The Sniffer class is used to deduce the format of a CSV file.
The Sniffer class provides two methods:
sniff ( sample, delimiters=None ) В¶
Analyze the given sample and return a Dialect subclass reflecting the parameters found. If the optional delimiters parameter is given, it is interpreted as a string containing possible valid delimiter characters.
Analyze the sample text (presumed to be in CSV format) and return True if the first row appears to be a series of column headers.
An example for Sniffer use:
The csv module defines the following constants:
Instructs writer objects to quote all fields.
Instructs writer objects to only quote those fields which contain special characters such as delimiter, quotechar or any of the characters in lineterminator.
Instructs writer objects to quote all non-numeric fields.
Instructs the reader to convert all non-quoted fields to type float.
Instructs writer objects to never quote fields. When the current delimiter occurs in output data it is preceded by the current escapechar character. If escapechar is not set, the writer will raise Error if any characters that require escaping are encountered.
Instructs reader to perform no special processing of quote characters.
The csv module defines the following exception:
exception csv. Error В¶
Raised by any of the functions when an error is detected.
Dialects and Formatting ParametersВ¶
To make it easier to specify the format of input and output records, specific formatting parameters are grouped together into dialects. A dialect is a subclass of the Dialect class having a set of specific methods and a single validate() method. When creating reader or writer objects, the programmer can specify a string or a subclass of the Dialect class as the dialect parameter. In addition to, or instead of, the dialect parameter, the programmer can also specify individual formatting parameters, which have the same names as the attributes defined below for the Dialect class.
Dialects support the following attributes:
On output, if doublequote is False and no escapechar is set, Error is raised if a quotechar is found in a field.
The reader is hard-coded to recognise either ‘\r’ or ‘\n’ as end-of-line, and ignores lineterminator. This behavior may change in the future.
Reader ObjectsВ¶
Reader objects ( DictReader instances and objects returned by the reader() function) have the following public methods:
Reader objects have the following public attributes:
A read-only description of the dialect in use by the parser.
The number of lines read from the source iterator. This is not the same as the number of records returned, as records can span multiple lines.
DictReader objects have the following public attribute:
If not passed as a parameter when creating the object, this attribute is initialized upon first access or when the first record is read from the file.
Writer ObjectsВ¶
Writer objects ( DictWriter instances and objects returned by the writer() function) have the following public methods. A row must be an iterable of strings or numbers for Writer objects and a dictionary mapping fieldnames to strings or numbers (by passing them through str() first) for DictWriter objects. Note that complex numbers are written out surrounded by parens. This may cause some problems for other programs which read CSV files (assuming they support complex numbers at all).
csvwriter. writerow ( row ) В¶
Changed in version 3.5: Added support of arbitrary iterables.
Write all elements in rows (an iterable of row objects as described above) to the writer’s file object, formatted according to the current dialect.
Writer objects have the following public attribute:
A read-only description of the dialect in use by the writer.
DictWriter objects have the following public method:
Write a row with the field names (as specified in the constructor) to the writer’s file object, formatted according to the current dialect. Return the return value of the csvwriter.writerow() call used internally.
Changed in version 3.8: writeheader() now also returns the value returned by the csvwriter.writerow() method it uses internally.
ExamplesВ¶
The simplest example of reading a CSV file:
Reading a file with an alternate format:
The corresponding simplest possible writing example is:
Since open() is used to open a CSV file for reading, the file will by default be decoded into unicode using the system default encoding (see locale.getpreferredencoding() ). To decode a file using a different encoding, use the encoding argument of open:
The same applies to writing in something other than the system default encoding: specify the encoding argument when opening the output file.
Registering a new dialect:
A slightly more advanced use of the reader — catching and reporting errors:
And while the module doesn’t directly support parsing strings, it can easily be done:
Работа с файлами в формате CSV¶
И хотя у форматов с другим разделителем может быть и собственное название, например, TSV (tab separated values), тем не менее, под форматом CSV понимают, как правило, любые разделители.
Пример файла в формате CSV (sw_data.csv):
В стандартной библиотеке Python есть модуль csv, который позволяет работать с файлами в CSV формате.
Чтение¶
Пример чтения файла в формате CSV (файл csv_read.py):
В первом списке находятся названия столбцов, а в остальных соответствующие значения.
Обратите внимание, что сам csv.reader возвращает итератор:
При необходимости его можно превратить в список таким образом:
Чаще всего заголовки столбцов удобней получить отдельным объектом. Это можно сделать таким образом (файл csv_read_headers.py):
Для этого в модуле есть DictReader (файл csv_read_dict.py):
До Python 3.8 возвращался отдельный тип упорядоченные словари (OrderedDict).
Запись¶
Аналогичным образом с помощью модуля csv можно и записать файл в формате CSV (файл csv_write.py):
В примере выше строки из списка сначала записываются в файл, а затем содержимое файла выводится на стандартный поток вывода.
Так получилось из-за того, что во всех строках последнего столбца есть запятая. И кавычки указывают на то, что именно является целой строкой. Когда запятая находится в кавычках, модуль csv не воспринимает её как разделитель.
Иногда лучше, чтобы все строки были в кавычках. Конечно, в данном случае достаточно простой пример, но когда в строках больше значений, то кавычки позволяют указать, где начинается и заканчивается значение.
Модуль csv позволяет управлять этим. Для того, чтобы все строки записывались в CSV-файл с кавычками, надо изменить скрипт таким образом (файл csv_write_quoting.py):
Теперь вывод будет таким:
Теперь все значения с кавычками. И поскольку номер модели задан как строка в изначальном списке, тут он тоже в кавычках.
Кроме метода writerow, поддерживается метод writerows. Ему можно передать любой итерируемый объект.
Например, предыдущий пример можно записать таким образом (файл csv_writerows.py):
DictWriter¶
С помощью DictWriter можно записать словари в формат CSV.
В целом DictWriter работает так же, как writer, но так как словари не упорядочены, надо указывать явно в каком порядке будут идти столбцы в файле. Для этого используется параметр fieldnames (файл csv_write_dict.py):
Указание разделителя¶
Иногда в качестве разделителя используются другие значения. В таком случае должна быть возможность подсказать модулю, какой именно разделитель использовать.
Например, если в файле используется разделитель ; (файл sw_data2.csv):
Обрабатываем csv файлы — Модуль csv
Модуль csv дает программисту возможность выполнять структурный анализ файлов CSV (Comma Separated Values – переменные, разделенные запятыми). Файл CSV – это текстовый файл, в котором каждая строка имеет несколько полей, разделенных запятыми, или другими разделителями. Вы можете рассматривать каждую строчку как ряд, а каждое поле — как столбец. Формат CSV не имеет стандарта, но эти файлы достаточно похожи, так что модуль csv может распознавать большую часть этих файлов. Вы также можете создавать файлы CSV, используя данный модуль.
Чтение файлов CSV
Существует два способа чтения файлов CSV. Вы можете использовать функцию чтения модуля csv, или использовать класс DictReader. Мы рассмотрим оба метода. Но сначала, нам нужно получить файлы CSV, чтобы было над чем работать. В интернете есть много сайтов, предлагающих познавательную информацию в формате CSV. Мы используем сайт всемирной организации здравоохранения, чтобы скачать кое-какую информацию о туберкулёзе. Вы можете получить её здесь: http://www.who.int/tb/country/data/download/en/
Как только вы скачаете файл, мы будем готовы начать. Готовы? Давайте взглянем на следующий код:
Вот здесь мы остановимся. В первую очередь, нам нужно импортировать модуль csv. После этого, нам нужно создать очень простую функцию, под названием csv_reader, которая получает доступ к объекту файла. Внутри функции, мы передаем файл функции csv.reader, которая возвращает объект-считыватель. Объект-считыватель позволяет выполнить итерацию также, как это делает обычный объект file.
Это позволяет выполнять итерацию над каждым рядом в объекте-считывателе и отобразить строку данных, но без запятых. Это работает по той причине, что каждый ряд является списком, и мы можем объединить все элементы в списке вместе, создав одну большую строку. А теперь мы создадим наш собственный файл CSV и загрузим его в класс DictReader. Вот очень простой пример:
В данном примере мы открыли файл и привязали объект файла к нашей функции таким же образом, каким мы делали это раньше. Функция привязывает наш объект к нашему классу DictReader. Мы указываем классу DictReader, что разделителем является запятая. Не то, что бы это было необходимо в нашем коде, так как он работает и без этого аргумента. Тем не менее, это хорошая идея, так как это позволяет пролить свет на то, что именно происходит внутри кода. Далее, мы применяем цикл над объектом-считывателем, и обнаруживаем, что каждая строка в нем – это словарь. Это упрощает печать отдельных фрагментов линии. Теперь мы готовы научиться писать файл csv на диск.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Telegram Чат & Канал
Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Пишем CSV файл
Модуль csv также имеет два метода, которые вы можете применять для написания файла CSV. Вы можете использовать функцию writer, или класс DictWriter. Мы рассмотрим оба метода. Начнем с функции writer. Давайте взглянем на простой пример:
В данном коде мы создали функцию csv_writer которая принимает два аргумента: path и data. «data» — это список списков, которые мы создали внизу скрипта. Мы использовали сокращенную версию аргумента data из предыдущего примера и разделили строки запятыми. Это возвращает список. Таким образом, мы получаем вложенный список, который выглядит следующим образом:
Функция csv_writer открывает путь, по которому мы проходим, и создает объект записи csv. После этого мы используем цикл в нашем вложенном списке, и записываем каждую строку на наш диск. Обратите внимание на то, что мы указали на то, какой именно символ является разделителем, когда создавали объект записи. Если вы хотите, чтобы разделителем была не запятая, а любой другой символ – это именно та самая часть, в которой вы можете это указать.
Теперь мы готовы к тому, чтобы научиться писать файлы CSV при помощи класса DictWriter. Мы используем аргумент data из предыдущего примера, и превратим его в список словарей, которые мы можем загрузить в наш DictWriter. Давайте взглянем:
Начнем со второй части. Как вы видите, мы начали со структуры вложенного списка, который у нас был ранее. Теперь мы создаем пустой список и список, который содержит имена полей, который будет первым списком во вложенном списке. Помните, списки начинаются с нуля, так что первый элемент в нем начинается с нуля. Далее мы используем цикл во вложенном списке, начиная со второго элемента:
Внутри цикла for мы используем встроенные инструменты Python, чтобы создать словарь. Метод zip будет использовать два итератора (списка, в нашем случае), и превратит их в список кортежей. Давайте взглянем на пример:
Теперь, когда вы оборачиваете этот вызов в dict, этот список кортежей превращается в словарь. И наконец, мы добавляем словарь в список. Когда for завершит работу, вы получите структуру данных, которая будет выглядеть так:
В конце второй сессии, мы вызываем нашу функцию csv_dict_writer и передаем ей все необходимые аргументы. Внутри функции мы создаем экземпляр DictWriter и передаем ей объекту файла, значение разделителя и наш список наименований полей. Далее, мы записываем наименования полей на наш диск, зацикливаем данные по одной строке за раз, и записываем данные на диск. Класс DictWriter также поддерживает метод writerows, который мы можем использовать вместо цикла. Функция csv.writer также может делать это. Вы, может быть, заинтересованы в том, что бы научиться создавать диалекты при помощи модуля csv. Это позволит вам указывать модулю csv, как именно читать или писать файл в очень простой форме. Если вам это нужно, так файл вашего клиента непонятно как отформатирован – вы найдете эту часть функционала просто незаменимой.
Подведем итоги
Теперь вы знаете, как использовать метод csv, а также научились читать и писать файлы в формате CSV. Существует великое множество сайтов, которые размещают свою информацию в этом формате, также он часто используется в сфере бизнеса.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)



