- CSV в Python
- Что такое файлы CSV
- Библиотека CSV
- Чтение из файлов (парсинг)
- Дополнительные параметры объекта DictReader
- Запись в файлы
- Дополнительные параметры DictWriter
- Диалекты
- How To Read A CSV File In Python
- Read A CSV File Using Python
- 1. Using the CSV Library
- 2. Using the Pandas Library
- Possible Delimiters Issues
- Solution For Delimiters Using the CSV Library
- Solution For Delimiters Using the Pandas Library
- Up Next
CSV в Python
Программисты часто сталкиваются с задачей обработки больших объемов структурированных данных. Python имеет встроенную библиотеку CSV, с помощью которой программист может работать со специальными CSV файлами. Это своего рода электронные таблицы.
Что такое файлы CSV
Файл CSV – это особый вид файла, который позволяет структурировать большие объемы данных.
По сути, он является обычным текстовым файлом, однако каждый новый элемент отделен от предыдущего запятой или другим разделителем. Обычно каждая запись начинается с новой строки. Данные CSV можно легко экспортировать в электронные таблицы или базы данных. Программист может расширять CSV файл, добавляя новые строки.
Пример CSV файла, где в качестве разделителя используется запятая:
Имя,Профессия,Год рождения Виктор,Токарь, 1995 Сергей,Сварщик,1983
Как видно из примера, в первой строке обычно указывается, какая информация будет находиться в каждом столбце. Кроме того, после последнего элемента строки запятая не ставиться, интерпретатор определяет конец строки по символу переноса.
Вместо запятой можно использовать любой другой разделитель, поэтому при чтении CSV файла нужно заранее знать, какой символ используется.
Важно помнить, что CSV – это обычный текстовый файл, который не поддерживает символы в кодировках, отличающихся от ASCII или Unicode.
Библиотека CSV
Эта основная библиотека для работы с CSV файлами в Python.
Библиотека 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 :
Диалекты
Чтобы каждый раз не указывать формат входных и выходных данных, определенные параметры форматирования сгруппированы в диалекты (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
How To Read A CSV File In Python
I first began to work with CSV files when taking the backend portion of my software engineering bootcamp curriculum. It wasn’t until I began to dive more into the data science portion of my continued learning that I began to use them on a regular basis.
CSV stands for comma-separated values, and files containing the .csv extension contain a collection of comma-separated values used to store data.
In this tutorial we will be using the public Beach Water Quality data set stored in the bwq.csv file. You can obtain the file by downloading it from Kaggle, however, you should be able to read any csv file following the instructions below.
Read A CSV File Using Python
There are two common ways to read a .csv file when using Python. The first by using the csv library, and the second by using the pandas library.
1. Using the CSV Library
import csv with open("./bwq.csv", 'r') as file: csvreader = csv.reader(file) for row in csvreader: print(row)
Here we are importing the csv library in order to use the .reader() method it contains to help us read the csv file.
The with keyword allows us to both open and close the file without having to explicitly close it.
The open() method takes two arguments of type string . First the file name, and second a mode argument. We are using r for read, however this can be omitted as r is assumed by default.
We then iterate over all the rows.
You should expect an output in the terminal to look something like this:
2. Using the Pandas Library
import pandas as pd data = pd.read_csv("bwq.csv") data
Here we’re importing Pandas, a Python library used to conduct data manipulation and analysis. It contains the .read_csv() method we need in order to read our csv file.
You should expect the output to look something like this:
Possible Delimiters Issues
The majority of csv files are separated by commas, however, there are some that are separated by other characters, like colons for example, which can output strange results in Python.
Solution For Delimiters Using the CSV Library
To change the delimiter using the csv library, simply pass in the delimiter= ‘:’ argument in the reader() method like so:
import csv with open("./fileWithColonDelimeter.csv", 'r') as file: csvreader = csv.reader(file, delimiter=':') for row in csvreader: print(row)
For other edge cases in reading csv files using the csv library, check out this page in the Python docs.
Solution For Delimiters Using the Pandas Library
To change the delimiter using the pandas library, simply pass in the argument delimiter= ‘:’ in the read_csv() method like so:
import pandas as pd data = pd.read_csv("fileWithColonDelimeter.csv", delimiter= ':') data
For other edge cases in reading csv files using the Pandas library check out this page the Pandas docs.
Up Next
Better Dependency Management in Python is a great introduction to using Earthly with Python and if you want to bring your CI to the next level, check out Earthly’s open source build tool.
Earthly makes CI/CD super simple
Fast, repeatable CI/CD with an instantly familiar syntax – like Dockerfile and Makefile had a baby.