При решении различных задач на языке программирования Python, программистам приходится часто сталкиваться с задачей обработки больших массивов данных. На уровне встроенного языка, Python содержит встроенную библиотеку для работы с CSV файлами, с помощью которой программисты могут без особого труда работать с файлами электронных таблиц CSV.
Файлы CSV
Файл CSV (значения, разделённые запятыми) является по сути текстовым файлам, данные в котором разделены с помощью специального разделителя. В качестве разделителя обычно используется запятая или символ «;», но могут использоваться и другие разделители. Каждая новая запись в файле CSV начинается с новой строки.
Формат файлов CSV можно легко экспортировать в электронные таблицы или базы данных.
Пример CSV файла, где разделителем используется «;»:
Фамилия; Имя; Отчество; Место работы; Год рождения Сидоров; Иван; Петрович; Нижний Тагил; 1995 Загоруля; Петр; Иванович; Нижний Тагил; 1974
import csv
with open("file.csv", encoding='utf-8') as file:
csvfilereader = csv.reader(file, delimiter=";")
# Счетчик
i = 0
for r in csvfilereader:
# Для заголовков
if i == 0:
print(f'Файл содержит столбцы: {";".join(r)}')
# Для строк
else:
print(f'{r[0]} {r[1]} {r[2]} - {r[3]}
f'родился в городе {r[4]}.')
i += 1
print(f'В файле {i} строк.')
Исходя из примера приведенного ниже, в первой строке указывается заголовок информации, которая буден находится к каждом столбце. В конце каждой строки с данными, после последнего элемента разделитель, в данном случае это запятая, не ставится, и интерпретатор определяет конец строки по символу переноса.
Разделителем может выступать любой другой символ, поэтому очень важно при чтении CSV файла заранее знать какой символ используется в качестве разделителя. Файл CSV – это по сути обычный текстовый файл, который не поддерживает символы в кодировках, отличающихся от ASCII или Unicode.
Библиотека CSV
Эта библиотека является встроенной, и её не нужно дополнительно скачивать через систему управления пакетами pip. Эта библиотека является основной для работы с файлами CSV в Python. Она импортируется как обычные встроенные библиотеки:
import csv
Чтение и парсинг файлов
Чтобы прочитать файл csv, необходимо создать объект reader:
object = csv.reader(data, delimiter = ";")
Объект reader имеет метод __next__(), и является итерируемым объектом.
Чтение файла будет происходить так:
import csv
with open("file.csv", encoding='utf-8') as file:
csvfilereader = csv.reader(file, delimiter=";")
# Счетчик
i = 0
for r in csvfilereader:
# Для заголовков
if i == 0:
print(f'Файл содержит столбцы: {";".join(r)}')
# Для строк
else:
print(f'{r[0]} {r[1]} {r[2]}-{r[3]} родился в городе {r[4]}.')
i += 1
print(f'В файле {i} строк.')
Допустим, у нас есть CSV файл, который содержит следующую информацию:
Фамилия, Имя, Отчество, Оценка, Место рождения Сидоров, Иван, Иванович, 3, Москва Зубрило, Антон, Николаевич, 4, Севастополь Петров, Борис, Захарович, 5, Курск
Если запустить данный код в интерпретаторе, то получим следующее:
Файл содержит столбцы: Фамилия, Имя, Отчество, Оценка, Место рождения
Сидоров Иван Иванович - 3 родился в городе Москва.
Иванова Екатерина Анатольевна - 3 родился в городе Севастополь.
Петров Борис Захарович - 4 родился в городе Курск.
В файле 4 строк.
Конструкция with…as используется для того, чтобы быть уверенным, что файл будет корректно закрыт в случае если при выполнении программного кода произойдет непредвиденная ошибка.
Стоит уделить внимание на то, что если перед чтением файла принудительно не установить правильную кодировку, в которой ранее файл был сохранен в нашем случае «UTF-8», то будет использоваться кодировка, определенная по умолчанию. Для windows это cp1251.
Встроенная библиотека работы с CSV позволяет использовать словари для работы с файлами. Для этого необходимо создать объект DictReader. С его помощью обращаться к элементам можно будет по имени столбцов, а не с помощью индексов. Исправим исходную программу с учетом этого:
import csv
with open("file.csv", encoding='utf-8') as file:
CsvDictReader = csv.DictReader(file, delimiter=";")
# Счетчик
i = 0
for r in CsvDictReader:
# Для заголовков
if i == 0:
print(f'Файл содержит столбцы: {";".join(r)}')
# Для строк
print(f' {r["Фамилия"]} {r["Имя"]} {r["Отчество"]} - {r["Оценка"]}'
f' родился в городе {r["Место рождения"]}.')
i += 1
print(f'В файле {i} строк.')
Обращение к элементам по названию упрощает понимание кода, к тому же так более удобно.
При использовании DictReader в первой строке цикла будет содержаться не заголовок таблицы, а первая строка с данными. Поэтому для вывода заголовка используется условие i==0.
Дополнительные параметры объекта DictReader
DictReader имеет параметры:
fieldnames– Определяет заголовки для столбцов;dialect– Параметры для форматирования информации. Ниже будут описаны подробности;line_num– Устанавливает лимит на количество строк, которое может быть прочитано.
Например, если бы файл file.csv не содержал первую строку с заголовками, то можно было бы его открыть следующим образом:
heading = [‘Фамилия’, ‘Имя’, ‘Отчество’, ‘Оценка’, ‘Место рождения’]
object = csv.DictReader(file, fieldnames = heading)
Если не определить атрибут, то в него запишутся элементы из первой прочитанной строки файла. Заголовки можно и не задавать, но файл содержащий заголовки будет более понятен.
Запись в CSV
Для записи информации с CSV файл нужно использовать специальный объект writer.
w = csv.writer(file, delimiter = "\t")
Запись новой строки в файл осуществляется с помощью метода writerow(). Этот метод имеет следующий синтаксис:
writerow("Имя", "Пол", "Возраст")
Пример программы с использованием метода writerow():
import csv
with open("file.csv", mode="w", encoding='utf-8') as file:
w = csv.writer(file, delimiter = ",", lineterminator="\r")
w.writerow(["Имя", "Пол", "Возраст"])
w.writerow(["Даша", "Женский", "7"])
w.writerow(["Степа", "Мужской", "14"])
w.writerow(["Иван", "Мужской", "16"])
В данном примере в качестве разделителей значений используется «;». Для разделения строк таблицы по умолчанию это параметр
lineterminatorсо значением\r\n. В нашем примере мы использовали просто\r
После выполнения этого фрагмента кода, в файл CSV будет записаны следующие данные:
Имя, Пол, Возраст Даша, Женский, 7 Степа, Мужской, 14 Иван, Мужской, 16
В метод writerow() необходимо передавать список, который в последствии будет записан в файл через симол-разделитель.
Запись в файл также может быть осуществлена с помощью объекта DictWriter.
Метод DictWriter требует строгого указания параметра fieldnames. В качестве данных для записи используется словарь.
Пример программы выглядит так:
import csv
with open("file.csv", mode="w", encoding='utf-8') as file:
names = ["Фамилия", "Имя"]
w = csv.DictWriter(file, delimiter = ",",lineterminator="\r", fieldnames=names)
w.writeheader()
w.writerow({"Фамилия": "Зимина", "Имя": "Надя"})
w.writerow({"Фамилия": "Сидорова", "Имя": "Маша"})
w.writerow({"Фамилия": "Петров", "Имя": "Вова"})
Результат, который будет записан в файл будет следующим:
Фамилия, Имя Зимина, Надя Сидорова, Маша Петров, Вова
В примере приведенном выше, использовался метод
writeheader(). Этот метод записывает заголовки для столбцов. Заголовки должны быть переданы объекту writer в виде списка по аналогии с атрибутом fieldnames.
Объект DictWriter также имеет еще один замечательный метод:
writerows(rows)– Записывает все элементы строк.
Ниже приведен листинг кода использующий этот метод. Рассмотрим пример кода с использованием метода writerows:
writer.writerows([{"Фамилия": "Зимина", "Имя": "Надя"},
{"Фамилия": "Сидорова", "Имя": "Маша"},
{"Фамилия": "Петров", "Имя": "Вова"}])
Объект writer имеет атрибут dialect, который определяет, как будут отформатированы данные при записи в файл.
Диалекты
Форматы входных и выходных данных могут быть сгруппированы в диалекты (dialect). При создании объектов reader или writer можно назначить нужный диалект, также можно переопределить диалект вручную, указав их при создании объекта.
Для инициализации диалекта используется команда:
csv.register_dialect("имя", delimiter = ",", ...)
Возможно использовать следующие атрибуты для указания форматирования:
- Delimiter – Задает символ, который будет разделять элементы в файле. Запятая используется по умолчанию.
- Doublequote — Если False, то к символу qutechar добавляется ecsapechar в качестве префикса, если True, то символ quotechar удваивается.
- Escapechar – Использует один символ, для экранирования символа-разделителя.
- Lineterminator — Определяет разделитель для строк, по умолчанию используется “\r\n”
- Quotechar — Определяет символ, который используется для окружения символа-разделителя. По умолчанию используются двойные кавычки, то есть quotechar = ‘»’
- Quoting – если не используются кавычки, то определяет символ, который используется для экранирования символа разделителя.
- Skipinitialspace – При установке в true, то все пробелы после символа-разделителя будут игнорироваться.
- Strict – если установить true, то в случае некорректно сформированного файла CSV будет вызвано исключение Error
Пример использования диалекта:
<pre>import csv
csv.register_dialect('my_di', delimiter=':', lineterminator="\r")
with open("file.csv", mode="w", encoding='utf-8') as file:
w = csv.writer(file, 'my_di')
w.writerow(["Фамилия", "Имя", "Пол"])
w.writerow(["Зимина", "Надя", "Женский"])
w.writerow(["Сидорова", "Маша", "Женский"])
w.writerow(["Петров", "Вова", "Мужской"])</pre>
В результате получим:
Фамилия:Имя:Пол Зимина:Надя:Женский Сидорова:Маша:Женский Петров:Вова:Мужской

