Как открыть csv в python
Перейти к содержимому

Как открыть csv в python

  • автор:

Чтение файлов в формате CSV в Python

CSV расшифровывается как «Comma Separated Values», т.е. «значения, разделенные запятыми». Это самый простой способ хранения данных в виде обычного текста. Данные представлены в табличной форме, где каждая строка является строкой записи таблицы. Сегодня мы поговорим про чтение формата CSV в Python. Расскажем о различных функциях для работы с CSV-файлами, а также о том, как создать свой файл CSV.

Чтение CSV-файла при помощи csv.reader(). Метод 1

Пример 1. Использование запятой в качестве разделителя

Допустим, у нас есть файл с именем sample1, содержащий некоторые данные. Такой файл можно создать с помощью любого текстового редактора или путем передачи значений в какую-нибудь программу для записи файла CSV. Как это делается, мы расскажем чуть позже.

Текст в этом файле разделен запятыми. Наши данные — сведения о различных книгах (порядковый номер, название, имя автора).

python read csv tutorial 1

Переходим к коду. Чтобы прочитать файл CSV, нам нужен объект reader для выполнения функции чтения. Первым делом импортируем модуль csv (встроенный модуль Python). Далее укажем имя файла, который нужно открыть (или путь к нему). Затем инициализируем объект reader . Он будет перебираться в цикле for .

reader = csv.reader(файл)

Данные из указанного файла выводятся построчно.

python read csv tutorial 2

Запустим наш код. Можем увидеть, что наши данные автоматически преобразовались в списки, состоящие из элементов данных каждой строки.

Пример 2. Использование табуляции в качестве разделителя

В первом примере текст разделяется запятой. Однако мы можем сделать наш код более настраиваемым, добавив различные функции.

Возьмём код из предыдущего примера и сделаем лишь одно изменение: напрямую укажем разделитель ( delimiter ). В предыдущем примере не было никакой необходимости его указывать, потому что запятая — разделитель по умолчанию.

reader = csv.reader(file, delimiter = ‘\t’)

python read csv tutorial 3

Как видите, результат немного изменился. Теперь все элементы строки являются одним элементом списка. Так произошло потому, что в этот раз мы указали в качестве разделителя не запятую, а \t .

Чтение CSV-файла при помощи csv.reader(). Метод 2

Теперь давайте обсудим альтернативный метод чтения файлов CSV. Предположим, у нас есть файл sample5, сохраненный с расширением .csv. В файле сохранены данные об учениках, их именах, классе и предметах.

python read csv tutorial 4

Теперь перейдем к коду. Первый шаг такой же, как и в прошлый раз – импорт модуля. Затем укажем путь или имя файла, который необходимо открыть и использовать.

Этот код является примером одновременного чтения и изменения данных. Мы инициализируем два массива для будущего использования в этом коде. Затем открываем файл с помощью функции open() . Далее инициализируем объект, как мы это делали в приведенных выше примерах. Здесь снова используется цикл for .

Следующая функция сохраняет текущее значение строк и пересылает объект для следующей итерации:

fields = next(csvreader)

python read csv tutorial 5

Все строки добавляются к списку с именем rows .

rows.append(row)

Если мы хотим увидеть общее количество строк, вызовем следующую функцию вывода.

print(“total rows are: %d “%(csvreader.line_num))

Чтобы вывести заголовок столбца или имя поля, используем функцию, в которой к тексту (с помощью метода .join() ) присоединяются все заголовки.

После выполнения вы можете увидеть результат, в котором каждая строка напечатана с полным описанием и текстом, который мы добавили с помощью кода во время выполнения.

Использование DictReader

Эта функция используется для вывода данных из текстового файла в виде словаря.

У нас есть файл sample7.txt со следующими данными об учениках.

python read csv tutorial 6

Примечание. Не обязательно сохранять файл с расширением .csv, можно и в других форматах. Главное, чтобы в самом файле использовался простой текст и данные оставались в первозданном виде.

Теперь воспользуемся приведенным ниже кодом, чтобы прочитать данные и вывести их в формате словаря. Вся методика одинакова, только вместо reader используется DictReader .

csv_file = csv.DictReader(file)

python read csv tutorial 7

Во время выполнения можно видеть, что данные печатаются в виде словаря. Данная функция преобразует каждую строку в словарь.

Пробелы в файлах CSV

Каждый раз при использовании csv.reader() мы автоматически получаем пробелы в выводе. Чтобы удалить эти лишние пробелы из вывода, нам нужно использовать функцию reader() , указав при этом специальный параметр. Предположим, файл содержит следующие данные, касающиеся информации о сотруднике.

python read csv tutorial 8

reader = csv.reader(file, skipinitialspace = True)

Укажем значение skipinitialspace , равное True. Благодаря этому неиспользуемое свободное пространство удаляется из вывода.

python read csv tutorial 9

Модуль CSV и диалекты

Если мы начнем работать, используя одни и те же файлы csv с форматами функций в коде, это сделает код очень некрасивым и непоследовательным. Модуль CSV помогает использовать метод диалектов в качестве опции для удаления избыточности данных.

Рассмотрим в качестве примера те же исходные данные, но на этот раз разделенные символом | . Мы хотим удалить этот символ, пропустить лишний пробел и использовать одинарные кавычки между соответствующими данными.

python read csv tutorial 10

Используя следующую строчку кода, мы получим желаемый результат

csv.register_dialect(‘myDialect’, delimiter =’|’, skipinitialspace=True, quoting= csv.QUOATE_ALL)

Эта строка отличается, поскольку она определяет три основные функции, которые необходимо выполнить. Из выходных данных вы можете видеть, что символ | удаляется, и также добавляются одинарные кавычки.

python read csv tutorial 11

Написание своего CSV-файла

Чтобы открыть файл csv, нам нужно его где-то взять. Если его нет, можно создать такой файл с помощью следующей функции.

Для начала импортируем модуль csv . Затем дадим имя файлу, который хотим создать. Для добавления данных мы будем использовать следующий код:

writer = csv.writer(file) writer.writerow(……)

Данные вводятся в файл построчно, поэтому следует использовать именно этот оператор.

python read csv tutorial 12

Заключение

В этой статье мы разобрали тему чтения формата CSV в Python. Мы показали, как вывести данные с помощью различных методов, в виде словарей или списков. Также мы рассказали, как удалить лишние пробелы и специальные символы из данных.

CSV в Python

Программисты часто сталкиваются с задачей обработки больших объемов структурированных данных. Python имеет встроенную библиотеку CSV, с помощью которой программист может работать со специальными CSV файлами. Это своего рода электронные таблицы.

Что такое файлы CSV

Файл CSV – это особый вид файла, который позволяет структурировать большие объемы данных.

По сути, он является обычным текстовым файлом, однако каждый новый элемент отделен от предыдущего запятой или другим разделителем. Обычно каждая запись начинается с новой строки. Данные CSV можно легко экспортировать в электронные таблицы или базы данных. Программист может расширять CSV файл, добавляя новые строки.

Пример CSV файла, где в качестве разделителя используется запятая:

Имя,Профессия,Год рождения Виктор,Токарь, 1995 Сергей,Сварщик,1983

Как видно из примера, в первой строке обычно указывается, какая информация будет находиться в каждом столбце. Кроме того, после последнего элемента строки запятая не ставиться, интерпретатор определяет конец строки по символу переноса.

Вместо запятой можно использовать любой другой разделитель, поэтому при чтении CSV файла нужно заранее знать, какой символ используется.

Важно помнить, что CSV – это обычный текстовый файл, который не поддерживает символы в кодировках, отличающихся от ASCII или Unicode.

Библиотека CSV

Эта основная библиотека для работы с CSV файлами в Python.

Библиотека csv является встроенной, поэтому её не нужно скачивать, достаточно использовать обычный импорт:

import csv

Чтение из файлов (парсинг)

Для того чтобы прочитать данные из файла, программист должен создать объект reader:

reader_object = csv.reader(file, delimiter = ",")

reader имеет метод __next__() , то есть является итерируемым объектом, поэтому чтение из файла происходит следующим образом:

import csv with open("classmates.csv", encoding='utf-8') as r_file: # Создаем объект reader, указываем символ-разделитель "," file_reader = csv.reader(r_file, delimiter = ",") # Счетчик для подсчета количества строк и вывода заголовков столбцов count = 0 # Считывание данных из CSV файла for row in file_reader: if count == 0: # Вывод строки, содержащей заголовки для столбцов print(f'Файл содержит столбцы: ') else: # Вывод строк print(f' - и он родился в году.') count += 1 print(f'Всего в файле строк.')

Предположим, что у нас есть CSV файл, который содержит следующую информацию:

Имя,Успеваемость,Год рождения Саша,отличник,200 Маша,хорошистка,1999 Петя,троечник,2000

Тогда, если открыть этот файл в нашей программе, то будут получены следующие результаты:

Файл содержит столбцы: Имя, Успеваемость, Год рождения Саша - отличник и он родился в 200 году. Маша - хорошистка и он родился в 1999 году. Петя - троечник и он родился в 2000 году. Всего в файле 4 строк.

Использование конструкции with…as позволяет программисту быть уверенным, что файл будет закрыт, даже если при выполнении кода произойдет какая-то ошибка.

Обратите внимание, что при открытии нужно указать правильную кодировку, в которой сохранены данные. В данном случае encoding=’utf-8′. Если не указывать, то будет использоваться кодировка по умолчанию. Для Windows это cp1251.

Библиотека CSV позволяет работать с файлами, как со словарями, для этого нужно создать объект DictReader. Обращаться к элементам можно по имени столбцов, а не с помощью индексов. Для того, чтобы исходная программа делала аналогичный вывод, её следует изменить следующим образом:

import csv with open("classmates.csv", encoding='utf-8') as r_file: # Создаем объект DictReader, указываем символ-разделитель "," file_reader = csv.DictReader(r_file, delimiter = ",") # Счетчик для подсчета количества строк и вывода заголовков столбцов count = 0 # Считывание данных из CSV файла for row in file_reader: if count == 0: # Вывод строки, содержащей заголовки для столбцов print(f'Файл содержит столбцы: ') # Вывод строк print(f' - ', end='') print(f' и он родился в году.') count += 1 print(f'Всего в файле строк.')

Обращаться к элементам по названию столбца более удобно, кроме того, это упрощает понимание кода.

Обратите внимание, что в цикл for при первой итерации будет записан в row не шапка таблицы, а первая её строка. Поэтому при выводе количества строк переменную count увеличили на 1.

Дополнительные параметры объекта DictReader

DictReader имеет параметры:

  • dialect — Набор параметров для форматирования информации. Подробнее про них ниже.
  • line_num — Устанавливает количество строк, которое может быть прочитано.
  • fieldnames — Определяет заголовки для столбцов, если не определить атрибут, то в него запишутся элементы из первой прочитанной строки файла. Заголовки нужны для того, чтобы легко было понять, какая информация содержится или должна содержаться в столбце.

Например, если бы в classmates.csv не было бы первой строки с заголовками, то можно было бы его открыть следующим образом:

fieldnames = ['Имя', 'Успеваемость', 'Год рождения'] file_reader = csv.DictReader(r_file, fieldnames = fieldnames)

Также можно использовать метод __next__() для получения следующей строки. Этот метод делает объект reader итерируемым. То есть он вызывается при каждой итерации и возвращает следующую строку. Этот метод и используется при каждой итерации в цикле for для получения очередной строки.

Запись в файлы

Для записи информации в CSV файл необходимо создать объект writer:

file_writer = csv.writer(w_file, delimiter = "\t")

Для записи в файл данных используется метод writerow(), который имеет следующий синтаксис:

writecol("Имя", "Фамилия", "Отчество")

Код программы для записи в CSV файл выглядит так:

import csv with open("classmates.csv", mode="w", encoding='utf-8') as w_file: file_writer = csv.writer(w_file, delimiter = ",", lineterminator="\r") file_writer.writerow(["Имя", "Класс", "Возраст"]) file_writer.writerow(["Женя", "3", "10"]) file_writer.writerow(["Саша", "5", "12"]) file_writer.writerow(["Маша", "11", "18"])

Обратите внимание, что при записи использовался, lineterminator=»\r» . Это разделитель между строками таблицы, по умолчанию он «\r\n» .

После выполнения программы в файле CSV будет следующий текст:

Имя,Класс,Возраст Женя,3,10 Саша,5,12 Маша,11,18

В качестве параметра метод writerow() принимает список, элементы которого будут записаны в строку через символ-разделитель.

Запись в файл также может быть осуществлена с помощью объекта DictWriter. Важно помнить, что он требует явного указания параметра fieldnames. В качестве аргумента метода writerow используется словарь.

Код программы выглядит так:

import csv with open("classmates.csv", mode="w", encoding='utf-8') as w_file: names = ["Имя", "Возраст"] file_writer = csv.DictWriter(w_file, delimiter = ",", lineterminator="\r", fieldnames=names) file_writer.writeheader() file_writer.writerow() file_writer.writerow() file_writer.writerow()

Вывод в файл будет следующим:

Имя,Возраст Саша,6 Маша,15 Вова,14

Дополнительные параметры DictWriter

Объект writer также имеет атрибут dialect, который определяет, как будут форматироваться данные при записи в файл, про него будет описано ниже.

Кроме того, writer имеет методы:

  • writerows(rows) — Записывает все элементы строк.
  • writeheader() — Выводит заголовки для столбцов. Заголовки должны быть переданы объекту writer в виде списка, как атрибут fieldnames.

writeheader был использован в предыдущем примере. Рассмотрим применение writerows :

file_writer.writerows([, , ])

Диалекты

Чтобы каждый раз не указывать формат входных и выходных данных, определенные параметры форматирования сгруппированы в диалекты (dialect). При создании объекта reader или writer программист может указать нужный ему диалект, кроме того, некоторые параметры диалекта можно переопределить вручную, также указав их при создании объекта.

Для создания диалекта используется команда:

register_dialect("имя", delimiter = "\t", . )

Класс Dialect позволяет определить следующие атрибуты форматирования:

Атрибут Значение
delimiter Устанавливает символ, с помощью которого разделяются элементы в файле. По умолчанию используется запятая.
doublequote Если True, то символ quotechar удваивается, если False, то к символу qutechar добавляется ecsapechar в качестве префикса.
escapechar Строка из одного символа, которая используется для экранирования символа-разделителя.
lineterminator Определяет разделитель для строк, по умолчанию используется «\r\n»
quotechar Определяет символ, который используется для окружения символа-разделителя. По умолчанию используются двойные кавычки, то есть quotechar = ‘ » ‘.
quoting Определяет символ, который используется для экранирования символа разделителя (если не используются кавычки).
skipinitialspace Если установить значение этого параметра в True, то все пробелы после символа-разделителя будут игнорироваться.
strict Если установить в True, то при неправильном вводе CSV будет возбуждаться исключение Error.

Пример использования:

import csv csv.register_dialect('my_dialect', delimiter=':', lineterminator="\r") with open("classmates.csv", mode="w", encoding='utf-8') as w_file: file_writer = csv.writer(w_file, 'my_dialect') file_writer.writerow(["Имя", "Класс", "Возраст"]) file_writer.writerow(["Женя", "3", "10"]) file_writer.writerow(["Саша", "5", "12"]) file_writer.writerow(["Маша", "11", "18"])

В результате получим:

Имя:Класс:Возраст Женя:3:10 Саша:5:12 Маша:11:18

csv — Чтение и запись CSV файлов¶

Так называемый формат CSV (значения, разделённые запятыми) является наиболее распространенным форматом импорта и экспорта электронных таблиц и баз данных. Формат CSV использовался в течение многих лет до попыток описать формат стандартизированным образом в RFC 4180. Отсутствие четко определенного стандарта означает, что в данных, производимых и потребляемых различными приложениями, часто существуют незначительные различия. Эти различия могут вызвать раздражение при обработке файлов CSV из нескольких источников. Тем не менее, хотя разделители и символы кавычек различаются, общий формат достаточно похож, чтобы можно было написать один модуль, который может эффективно манипулировать такими данными, скрывая детали чтения и записи данных от программиста.

Модуль csv реализует классы для чтения и записи табулированных данных в формате CSV. Он позволяет программистам говорить, «запиши данные в формате, предпочитаемом Excel», или «прочти данные из файла, который был создан Excel», не зная точных деталей формата CSV используемого в Excel. Программисты также могут описать CSV форматы, понятные другим приложениям или определить собственные специальные форматы CSV.

Объекты reader и writer модуля csv читают и пишут последовательности. Программисты могут также читать и записывать данные в словарной форме, используя классы DictReader и DictWriter .

PEP 305 — CSV файловый API Предложение по улучшению Python, предложившее это дополнение к Python.

Содержание модуля¶

Модуль csv определяет следующие функции:

csv. reader ( csvfile, dialect=’excel’, **fmtparams ) ¶

Возвращает объект reader, который будет итерироваться по строкам в предоставленном 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 ) ¶

Возвращает объект writer, отвечающий за преобразование пользовательскиех данных с отдельными строками в предоставленный файлоподобный объект. 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 может быть определен передав подкласс Dialect или ключевые аргументы fmtparams или оба, с ключевыми аргументами переопределяющими параметры диалекта. Для получения всех подробностей о диалекте и параметрах форматирования, см. раздел Диалекты и параметры форматирования .

csv. unregister_dialect ( name ) ¶

Удалить диалект, связанный с name зарегистрированного диалекта. Поднимается Error , если name не зарегистрированное имя диалекта.

csv. get_dialect ( name ) ¶

Возвратит диалект, связанный с name. Поднимается Error , если name не зарегистрированное имя диалекта. Эта функция возвращает неизменяемый Dialect .

Возвратит названия всех зарегистрированных диалектов.

csv. field_size_limit ( [ new_limit ] ) ¶

Возвращает текущий максимальный размер поля, разрешённого парсером. Если new_limit передан, то он становится новым ограничением.

Модуль csv определяет следующие классы:

Создайть объект, работающий как обычный reader, но отображающий информацию каждой строки в dict , ключи которого задаются необязательным параметром fieldnames.

Параметр fieldnames является последовательностью . Если fieldnames пропущен, значения в первой строке файла f будут использоваться в качестве имен полей. Независимо от того, как определяются имена полей, словарь сохраняет их первоначальный порядок.

Если у строки больше полей, чем fieldnames, остающиеся данные помещаются в список и хранятся с fieldname, определенным restkey (который по умолчанию None ). Если у не пустой строки меньше полей, чем fieldnames, отсутствующие значения заполняются значениями 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)

Создаёт объект, который работает как обычный writer, но отображает словари на выходные строки. Параметр 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 .

Класс excel определяет обычные свойства создаваемого Excel файла CSV. Зарегистрирован с именем диалекта ‘excel’ .

class csv. excel_tab ¶

Класс excel_tab определяет обычные свойства произведенного Excel разделённого TAB’ами файла. Он зарегистрирован с именем диалекта ‘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, то он интерпретируется как строка, содержащий возможные допустимые символы разделителя.

Проанализировать типовой текст (предполагается, что он в формате CSV) и возвратить True , если перая строка, кажется, стокой заголовков колонки.

with open('example.csv', newline='') as csvfile: dialect = csv.Sniffer().sniff(csvfile.read(1024)) csvfile.seek(0) reader = csv.reader(csvfile, dialect) # . обработка CSV файла содержащегося здесь . 

Модуль csv определяет следующие константы:

Предписывает writer объектам закавычивать все поля.

Предписывает writer объектам закавычивать только те поля, которые содержат специальные символы, такие как delimiter, quotechar или любой из символов в lineterminator.

Предписывает writer объектам закавычивать все нечисловые поля.

Дает указание reader преобразовывать все незаковыченные поля в тип float.

Предписывает writer объектам никогда не закавычивать поля. Когда текущий delimiter появлется в выходных данных, ему предшествует текущий символ escapechar. Если escapechar не будет установлен, то writer поднимет Error , если столкнётся с какими-либо символами, которые требуют экранирования.

Дает указание reader не выполнять специальную обработку знаков цитаты.

Модуль csv определяет следующее исключение:

exception csv. Error ¶

Поднимается любой функцией при обнаружении ошибки.

Диалекты и параметры форматирования¶

Для упрощения задания формата входных и выходных записей, конкретные параметры форматирования группируются в диалекты. Диалект — это подкласс Dialect класса, имеющий набор специфических методов и единственный validate() метод. Создавая объекты reader или writer , программист может определить строку или подкласс класса Dialect как параметр диалекта. В дополнение, или вместо, параметра dialect, программист может также определить отдельные параметры форматирования, у которых есть те же имена как атрибуты, определенный ниже для класса Dialect .

Диалекты поддерживают следующие атрибуты:

Односимвольная строка, используемая для отделения полей. По умолчанию ‘,’ .

Управляет тем, как сущности quotechar, появляющиеся внутри поля, должены самостоятельно закавычиваться. Когда True , символ удваивается. Когда False , escapechar — используется как префикс к quotechar. По умолчанию он True .

При выводе, если doublequote False и не установлен escapechar, поднимается Error , если quotechar найден в поле.

Односимвольная строка используемая writer, чтобы экранировать delimiter, если quoting установлен в QUOTE_NONE и quotechar, если doublequote — False . При чтении escapechar удаляет какое-либо особое значение со следующего символа. По умолчанию используется значение None , которое отключает экранирование.

Используемая строка используемая для завершения строки, произведенная writer . По умолчанию используется значение ‘\r\n’ .

В reader жёсто закодированы опознавательные символы ‘\r’ или ‘\n’ как конец строки и игнорирует lineterminator. Это поведение может измениться в будущем.

Dialect. quotechar ¶

Одиносимвольная строка используемая для заковычивания полей, содержащих специальные символы, такие как delimiter или quotechar, или которые содержат символы новой строки. По умолчанию используется значение ‘»‘ .

Контролирует, когда кавычки должны генерироваться writer и распознаваться reader. Он может принимать любые константы QUOTE_* (см. раздел ) и по умолчанию имеет значение QUOTE_MINIMAL .

При True , пробелы непосредственно следующие за delimiter, игнорируются. Значение по умолчанию — False .

Когда True , поднимает исключение Error на плохом входном CSV. По умолчанию — False .

Объекты Reader¶

Объекты Reader ( DictReader сущности и объекты, возвращаемые функцией reader() ) содержат следующие публичные методы:

Возвращает следующую строку итерабельного объекта reader в виде списка (если объект возвращен из reader() ) или dict (если это экземпляр DictReader ), распарсиваемого в соответствии с текущим диалектом. Обычно вы должны вызывать его как next(reader) .

Объекты Reader содержат следующие публичные атрибуты:

Описание диалекта только для чтения, использующего парсер.

Количество сток читаемых из итерируемого источника. Это не то же самое, что и количество возвращаемых записей, поскольку записи могут охватить несколько строк.

У объектов DictReader есть следующий публичный атрибут:

Если не передан в качестве параметра, создаваемому объекту, то этот атрибут инициализируется при первом доступе или при чтении первой записи из файла.

Writer объекты¶

У объектов Writer ( DictWriter сущности и объекты, возвращённые функцией writer() ), есть следующий публичные методы. row должен быть итератором строк или чисел для объектов Writer и словаря, отображающего имена полей в строки или числа (передав им сначала str() ) для объектов DictWriter . Обратите внимание, что комплексные числа записываются в окружении родителей. Это может вызвать некоторые проблемы для других программ, которые читают файлы CSV (при условии, что они вообще поддерживают комплексные числа).

csvwriter. writerow ( row ) ¶

Записать параметр row в файл объекта writer, отформатированному согласно текущему диалекту. Возвратит возвращаемое значение вызываемое write методом основного объекта файла.

Изменено в версии 3.5: Добавлена поддержка произвольных итераторов.

csvwriter. writerows ( rows ) ¶

Написать все элементы в rows (итерируемый из объектов row, как описано выше) к объекту файла writer’a, отформатированному согласно текущему диалекту.

Объекты Writer содержат следующий публичный атрибут:

Описание диалекта, используемого Writer’ом только для чтения.

У объектов DictWriter есть следующий публичный метод:

Записать строку с именами полей (как определено в конструкторе) в объект файла писателя, отформатированному согласно текущего диалекта. Возвратит возвращаемое значение 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) 

Соответствуюobq простейший пример записи:

import csv with open('some.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerows(someiterable) 

Так как open() используется для открытия CSV файла для чтения, файл будет по умолчанию декодирован в юникоде использую системную кодировку по умолчанию (см. 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 выполняет собственную ( универсальную ) обработку новой строки.

Содержание

  • csv — Чтение и запись CSV файлов
    • Содержание модуля
    • Диалекты и параметры форматирования
    • Объекты Reader
    • Writer объекты
    • Примеры

    Работа с файлами в формате CSV#

    CSV (comma-separated value) — это формат представления табличных данных (например, это могут быть данные из таблицы или данные из БД).

    В этом формате каждая строка файла — это строка таблицы. Несмотря на название формата, разделителем может быть не только запятая.

    И хотя у форматов с другим разделителем может быть и собственное название, например, TSV (tab separated values), тем не менее, под форматом CSV понимают, как правило, любые разделители.

    Пример файла в формате CSV (sw_data.csv):

    hostname,vendor,model,location sw1,Cisco,3750,London sw2,Cisco,3850,Liverpool sw3,Cisco,3650,Liverpool sw4,Cisco,3650,London 

    В стандартной библиотеке Python есть модуль csv, который позволяет работать с файлами в CSV формате.

    Чтение#

    Пример чтения файла в формате CSV (файл csv_read.py):

    import csv with open('sw_data.csv') as f: reader = csv.reader(f) for row in reader: print(row) 

    Вывод будет таким:

    $ python csv_read.py ['hostname', 'vendor', 'model', 'location'] ['sw1', 'Cisco', '3750', 'London'] ['sw2', 'Cisco', '3850', 'Liverpool'] ['sw3', 'Cisco', '3650', 'Liverpool'] ['sw4', 'Cisco', '3650', 'London']

    В первом списке находятся названия столбцов, а в остальных соответствующие значения.

    Обратите внимание, что сам csv.reader возвращает итератор:

    In [1]: import csv In [2]: with open('sw_data.csv') as f: . : reader = csv.reader(f) . : print(reader) . : _csv.reader object at 0x10385b050> 

    При необходимости его можно превратить в список таким образом:

    In [3]: with open('sw_data.csv') as f: . : reader = csv.reader(f) . : print(list(reader)) . : [['hostname', 'vendor', 'model', 'location'], ['sw1', 'Cisco', '3750', 'London'], ['sw2', 'Cisco', '3850', 'Liverpool'], ['sw3', 'Cisco', '3650', 'Liverpool'], ['sw4', 'Cisco', '3650', 'London']] 

    Чаще всего заголовки столбцов удобней получить отдельным объектом. Это можно сделать таким образом (файл csv_read_headers.py):

    import csv with open('sw_data.csv') as f: reader = csv.reader(f) headers = next(reader) print('Headers: ', headers) for row in reader: print(row) 

    Иногда в результате обработки гораздо удобней получить словари, в которых ключи — это названия столбцов, а значения — значения столбцов.

    Для этого в модуле есть DictReader (файл csv_read_dict.py):

    import csv with open('sw_data.csv') as f: reader = csv.DictReader(f) for row in reader: print(row) print(row['hostname'], row['model']) 

    Вывод будет таким:

    $ python csv_read_dict.py sw1 3750 sw2 3850 sw3 3650 sw4 3650

    До Python 3.8 возвращался отдельный тип упорядоченные словари (OrderedDict).

    Запись#

    Аналогичным образом с помощью модуля csv можно и записать файл в формате CSV (файл csv_write.py):

    import csv data = [['hostname', 'vendor', 'model', 'location'], ['sw1', 'Cisco', '3750', 'London, Best str'], ['sw2', 'Cisco', '3850', 'Liverpool, Better str'], ['sw3', 'Cisco', '3650', 'Liverpool, Better str'], ['sw4', 'Cisco', '3650', 'London, Best str']] with open('sw_data_new.csv', 'w') as f: writer = csv.writer(f) for row in data: writer.writerow(row) with open('sw_data_new.csv') as f: print(f.read()) 

    В примере выше строки из списка сначала записываются в файл, а затем содержимое файла выводится на стандартный поток вывода.

    Вывод будет таким:

    $ python csv_write.py hostname,vendor,model,location sw1,Cisco,3750,"London, Best str" sw2,Cisco,3850,"Liverpool, Better str" sw3,Cisco,3650,"Liverpool, Better str" sw4,Cisco,3650,"London, Best str"

    Обратите внимание на интересную особенность: строки в последнем столбце взяты в кавычки, а остальные значения — нет.

    Так получилось из-за того, что во всех строках последнего столбца есть запятая. И кавычки указывают на то, что именно является целой строкой. Когда запятая находится в кавычках, модуль csv не воспринимает её как разделитель.

    Иногда лучше, чтобы все строки были в кавычках. Конечно, в данном случае достаточно простой пример, но когда в строках больше значений, то кавычки позволяют указать, где начинается и заканчивается значение.

    Модуль csv позволяет управлять этим. Для того, чтобы все строки записывались в CSV-файл с кавычками, надо изменить скрипт таким образом (файл csv_write_quoting.py):

    import csv data = [['hostname', 'vendor', 'model', 'location'], ['sw1', 'Cisco', '3750', 'London, Best str'], ['sw2', 'Cisco', '3850', 'Liverpool, Better str'], ['sw3', 'Cisco', '3650', 'Liverpool, Better str'], ['sw4', 'Cisco', '3650', 'London, Best str']] with open('sw_data_new.csv', 'w') as f: writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC) for row in data: writer.writerow(row) with open('sw_data_new.csv') as f: print(f.read()) 

    Теперь вывод будет таким:

    $ python csv_write_quoting.py "hostname","vendor","model","location" "sw1","Cisco","3750","London, Best str" "sw2","Cisco","3850","Liverpool, Better str" "sw3","Cisco","3650","Liverpool, Better str" "sw4","Cisco","3650","London, Best str"

    Теперь все значения с кавычками. И поскольку номер модели задан как строка в изначальном списке, тут он тоже в кавычках.

    Кроме метода writerow, поддерживается метод writerows. Ему можно передать любой итерируемый объект.

    Например, предыдущий пример можно записать таким образом (файл csv_writerows.py):

    import csv data = [['hostname', 'vendor', 'model', 'location'], ['sw1', 'Cisco', '3750', 'London, Best str'], ['sw2', 'Cisco', '3850', 'Liverpool, Better str'], ['sw3', 'Cisco', '3650', 'Liverpool, Better str'], ['sw4', 'Cisco', '3650', 'London, Best str']] with open('sw_data_new.csv', 'w') as f: writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC) writer.writerows(data) with open('sw_data_new.csv') as f: print(f.read()) 

    DictWriter#

    С помощью DictWriter можно записать словари в формат CSV.

    В целом DictWriter работает так же, как writer, но так как словари не упорядочены, надо указывать явно в каком порядке будут идти столбцы в файле. Для этого используется параметр fieldnames (файл csv_write_dict.py):

    import csv data = [ 'hostname': 'sw1', 'location': 'London', 'model': '3750', 'vendor': 'Cisco' >,  'hostname': 'sw2', 'location': 'Liverpool', 'model': '3850', 'vendor': 'Cisco' >,  'hostname': 'sw3', 'location': 'Liverpool', 'model': '3650', 'vendor': 'Cisco' >,  'hostname': 'sw4', 'location': 'London', 'model': '3650', 'vendor': 'Cisco' >] with open('csv_write_dictwriter.csv', 'w') as f: writer = csv.DictWriter( f, fieldnames=list(data[0].keys()), quoting=csv.QUOTE_NONNUMERIC) writer.writeheader() for d in data: writer.writerow(d) 

    Указание разделителя#

    Иногда в качестве разделителя используются другие значения. В таком случае должна быть возможность подсказать модулю, какой именно разделитель использовать.

    Например, если в файле используется разделитель ; (файл sw_data2.csv):

    hostname;vendor;model;location sw1;Cisco;3750;London sw2;Cisco;3850;Liverpool sw3;Cisco;3650;Liverpool sw4;Cisco;3650;London 

    Достаточно просто указать, какой разделитель используется в reader (файл csv_read_delimiter.py):

    import csv with open('sw_data2.csv') as f: reader = csv.reader(f, delimiter=';') for row in reader: print(row) 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *