Файл CSV
CSV-файл (Comma Separated Values – переменные, разделенные запятыми) - это тип обычного текстового файла, в котором для упорядочения табличных данных используется определенная структура.
CSV является распространенным форматом для обмена данными, поскольку он компактен, прост и универсален. Многие онлайн-сервисы позволяют пользователям экспортировать табличные данные с веб-сайта в файл CSV. Файлы CSV откроются в Excel, и почти во всех базах данных есть инструмент, позволяющий импортировать из файла CSV. Стандартный формат определяется данными строк и столбцов. Кроме того, каждая строка заканчивается новой строкой, чтобы начать следующую строку. Также внутри строки каждый столбец отделяется запятой.
Пример файла CSV
Данные в форме таблиц также называются CSV - буквально «значения, разделенные запятыми». Это текстовый формат, предназначенный для представления табличных данных. Каждая строка файла - это одна строка таблицы. Значения отдельных столбцов разделяются символом-разделителем - запятой (,), точкой с запятой (😉 или другим символом. CSV легко читается и обрабатывается Python.
Рассмотрим следующую таблицу.
Данные ввиде таблицы
Programming language | Designed by | Appeared | Extension |
---|---|---|---|
Python | Guido van Rossum | 1991 | .py |
Java | James Gosling | 1995 | .java |
C++ | Bjarne Stroustrup | 1983 | .cpp |
Вы можете представить эту таблицу в CSV, как показано ниже.
Данные ввиде CSV
Programming language,Designed by,Appeared,Extension
Python,Guido van Rossum,1991,.py
Java,James Gosling,1995,.java
C++,Bjarne Stroustrup,1983,.cpp
Каждая строка - это новая строка, а каждый столбец разделен запятой. Это пример того, как выглядит файл CSV
.
Модули для чтения и записи
Модуль CSV имеет несколько функций и классов, доступных для чтения и записи CSV, наиболее часто используемые из них:
- функция csv.reader()
- функция csv.writer()
- класс csv.DictReader()
- класс csv.DictWriter()
Модуль csv.reader
Модуль csv.reader()
принимает следующие параметры:
csvfile
: обычно это объект, который поддерживает перебор и обычно возвращает строку каждый раз, когда вызывается его метод__next__()
.dialect='excel'
: необязательный параметр, используемый для определения набора параметров, специфичных для определенного диалекта CSV.fmtparams
: необязательный параметр, который можно использовать для переопределения существующих параметров форматирования.
Вот пример того, как использовать модуль csv.reader
:
import csv
with open('data.csv') as file_csv:
for row in csv.reader(file_csv):
print(row)
2
3
4
5
Модуль csv.writer
Этот модуль похож на модуль csv.reader и используется для записи данных в CSV. Требуется три параметра:
csvfile
: это может быть любой объект с методомwrite()
.dialect = 'excel'
: необязательный параметр, используемый для определения набора параметров, специфичных для конкретного CSV.fmtparam
: необязательный параметр, который можно использовать для переопределения существующих параметров форматирования.
Классы DictReader и DictWriter
DictReader
и DictWriter
- это классы, доступные в Python для чтения и записи в CSV. Хотя они и похожи на функции чтения и записи, эти классы используют объекты словаря для чтения и записи в CSV-файлы.
DictReader
Он создает объект, который отображает прочитанную информацию в словарь, ключи которого задаются параметром fieldnames. Этот параметр является необязательным, но если он не указан в файле, данные первой строки становятся ключами словаря.
Пример:
import csv
with open('data.csv') as csv_file:
reader = csv.DictReader(csv_file)
for row in reader:
print(row)
2
3
4
5
6
DictWriter
Этот класс аналогичен классу DictWriter и выполняет противоположную функцию: запись данных в файл CSV. Класс определяется как
`csv.DictWriter(csvfile, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)`
Параметр fieldnames
определяет последовательность ключей, которые определяют порядок, в котором значения в словаре записываются в файл CSV. В отличие от DictReader, этот ключ не является обязательным и должен быть определен во избежание ошибок при записи в CSV.
Диалекты и форматирование
Диалект - это вспомогательный класс, используемый для определения параметров для конкретного экземпляра reader
или writer
. Диалекты и параметры форматирования должны быть объявлены при выполнении функции чтения или записи.
Есть несколько атрибутов, которые поддерживаются диалектом:
delimiter
: строка, используемая для разделения полей. По умолчанию это','
.double quote
: Управляет тем, как должны появляться в кавычках случаи, когда кавычки появляются внутри поля. Может бытьTrue
илиFalse
. escapechar: строка, используемая автором для экранирования разделителя, если в кавычках задано значение QUOTE_NONE.lineterminator
: строка, используемая для завершения строк, созданных writer. По умолчанию используется значение'\r\n'
.- quotechar: строка, используемая для цитирования полей, содержащих специальные символы. По умолчанию это
'"'
. skipinitialspace
: Если установлено значение True, любые пробелы, следующие сразу за разделителем, игнорируются.strict
: если установлено значение True, возникает Error при неправильном вводе CSV.quoting
: определяет, когда следует создавать кавычки при чтении или записи в CSV.
Чтение файла CSV
Давайте посмотрим, как читать CSV-файл, используя вспомогательные модули, которые мы обсуждали выше.
Создайте свой CSV-файл и сохраните его как example.csv. Убедитесь, что он имеет расширение .csv и заполните некоторые данные. Здесь у нас есть CSV-файл, который содержит имена учеников и их оценки.
first_name | last_name | Grade |
---|---|---|
Alex | Brian | B |
Rachael | Rodriguez | A |
Tom | smith | C |
Ниже приведен код для чтения данных в нашем CSV с использованием функции csv.reader и класса csv.DictReader
.
csv.reader()
Чтение CSV-файла с помощью import csv
with open('example.csv') as file_csv:
reader = csv.reader(file_csv, delimiter=',', quotechar=',', quoting=csv.QUOTE_MINIMAL)
for row in reader:
print(row)
2
3
4
5
6
В приведенном выше коде мы импортируем модуль CSV, а затем открываем наш файл CSV в виде file_csv
. Затем мы определяем объект reader и используем метод csv.reader для извлечения данных в объект. Затем мы перебираем объект reader и извлекаем каждую строку наших данных.
Мы показываем прочитанные данные, печатая их содержимое на консоль. Мы также указали обязательные параметры, такие как разделитель, кавычка и цитирование.
Вывод:
['first_name', 'last_name', 'Grade']
['Alex', 'Brian', 'B']
['Rachael', 'Rodriguez', 'A']
['Tom', 'smith', 'C']
2
3
4
Чтение CSV-файла с помощью DictReader
Как мы упоминали выше, DictWriter позволяет нам читать CSV-файл, отображая данные в словарь вместо строк, как в случае с модулем csv.reader. Хотя имя поля является необязательным параметром, важно всегда помечать столбцы для удобства чтения.
Вот как читать CSV, используя класс DictWriter()
.
import csv
results = []
with open('example.csv') as File:
reader = csv.DictReader(File)
for row in reader:
results.append(row)
print results
2
3
4
5
6
7
8
Сначала мы импортируем модуль csv
и инициализируем пустой список results
, который мы будем использовать для хранения полученных данных. Затем мы определяем объект reader
и используем метод csv.DictReader()
для извлечения данных в объект. Затем перебираем объект reader
и извлекаем каждую строку наших данных. Добавляем каждую строку в список результатов и выводим содержимое на консоль.
Вывод:
[{'Grade': 'B', 'first_name': 'Alex', 'last_name': 'Brian'},
{'Grade': 'A', 'first_name': 'Rachael', 'last_name': 'Rodriguez'},
{'Grade': 'C', 'first_name': 'Tom', 'last_name': 'smith'},
{'Grade': 'B', 'first_name': 'Jane', 'last_name': 'Oscar'},
{'Grade': 'A', 'first_name': 'Kennzy', 'last_name': 'Tim'}]
Лучше использовать класс DictReader()
, потому что c данными в формате словаря легче работать.
Запись в файл CSV
Давайте теперь посмотрим, как приступить к записи данных в файл CSV с использованием функции csv.writer()
и класса csv.Dictwriter()
, которые обсуждались в начале этого урока.
Запись в файл CSV с помощью csv.writer
Код ниже записывает данные, определенные в файл example2.csv
.
import csv
myData = [["first_name", "second_name", "Grade"],
['Alex', 'Brian', 'A'],
['Tom', 'Smith', 'B']]
myFile = open('example2.csv', 'w')
with myFile:
writer = csv.writer(myFile)
writer.writerows(myData)
print("Writing complete")
2
3
4
5
6
7
8
9
10
11
12
Сначала мы импортируем модуль csv, и функция writer()
создаст объект, подходящий для записи. Чтобы перебрать данные по строкам, нам нужно использовать функцию writerows()
.
Вот наш CSV с данными, которые мы записали в него.
first_name | last_name | Grade |
---|---|---|
Alex | Brian | B |
Rachael | Rodriguez | A |
Tom | smith | C |
Запись в файл CSV с использованием DictWriter
Давайте напишем следующие данные в CSV.
data = [{'Grade': 'B', 'first_name': 'Alex', 'last_name': 'Brian'},
{'Grade': 'A', 'first_name': 'Rachael', 'last_name': 'Rodriguez'},
{'Grade': 'C', 'first_name': 'Tom', 'last_name': 'smith'},
{'Grade': 'B', 'first_name': 'Jane', 'last_name': 'Oscar'},
{'Grade': 'A', 'first_name': 'Kennzy', 'last_name': 'Tim'}]
2
3
4
5
Код, показан ниже:
import csv
with open('example4.csv', 'w') as csvfile:
fieldnames = ['first_name', 'last_name', 'Grade']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'Grade': 'B', 'first_name': 'Alex', 'last_name': 'Brian'})
writer.writerow({'Grade': 'A', 'first_name': 'Rachael',
'last_name': 'Rodriguez'})
writer.writerow({'Grade': 'B', 'first_name': 'Jane', 'last_name': 'Oscar'})
writer.writerow({'Grade': 'B', 'first_name': 'Jane', 'last_name': 'Loive'})
print("Writing complete")
2
3
4
5
6
7
8
9
10
11
12
13
14
Сначала мы определим fieldnames, которые будут представлять заголовки каждого столбца в файле CSV. Метод .writerrow()
будет записывать по одной строке за раз. Если вы хотите записать все данные одновременно, вы будете использовать метод .writerrows()
.
Вот как можно записать все строки одновременно.
import csv
with open('example5.csv', 'w') as csvfile:
fieldnames = ['first_name', 'last_name', 'Grade']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerows([{'Grade': 'B', 'first_name': 'Alex', 'last_name': 'Brian'},
{'Grade': 'A', 'first_name': 'Rachael', 'last_name': 'Rodriguez'},
{'Grade': 'C', 'first_name': 'Tom', 'last_name': 'smith'},
{'Grade': 'B', 'first_name': 'Jane', 'last_name': 'Oscar'},
{'Grade': 'A', 'first_name': 'Kennzy', 'last_name': 'Tim'}])
print("writing complete")
2
3
4
5
6
7
8
9
10
11
12
13
14
Упражнения
Создайне data.csv
файл с данными:
Programming language, Designed by, Appeared, Extension
Python, Guido van Rossum, 91, .py
Java, James Gosling, 95, .java
C++, Bjarne Stroustrup, 83, .cpp
Напишите программу, которая используя методы
csv.reader()
иcsv.writer()
считывает данныеdata.csv
файла и обрабатывает данные:- редактирует годы в третьем столбце:
91, 95, 83
преобразует в 1991, 1995, 1983. - редактирует написание первой колонки, преобразует написание названий языков в написание большими буквами.
- добавьте данные о языке javascript:
JAVASCRIPT, Brendan Eich, 1995, .js
,C#, Microsoft, 2000, .сs
- вывести результат в консоль. Должен получиться подобно:
[[Programming language, Designed by, Appeared, Extension], [PYTHON, Guido van Rossum, 1991, .py], [JAVA, James Gosling, 1995, .java], [C++, Bjarne Stroustrup, 1983, .cpp], [JAVASCRIPT, Brendan Eich, 1995, .js], [С#, Microsoft, 2000, .сs]]
1
2
3
4
5
6- Запишите данные в новый файл:
data_change_1.csv
.
- редактирует годы в третьем столбце:
Напишите программу, которая используя методы
csv.DictReader()
иcsv.DictWriter()
считывает данныеdata.csv
файла и обрабатывает данные:- редактирует годы в третьем столбце:
91, 95, 83
преобразует в 1991, 1995, 1983. - редактирует написание первой колонки, преобразует написание названий языков в написание большими буквами.
- добавьте данные о языке javascript:
JAVASCRIPT,Brendan Eich,1995,.js
,C#,Microsoft,2000,.сs
- вывести результат в консоль. Должен получиться подобно:
[[Programming language, Designed by, Appeared, Extension], [PYTHON, Guido van Rossum, 1991, .py], [JAVA, James Gosling, 1995, .java], [C++, Bjarne Stroustrup, 1983, .cpp], [JAVASCRIPT, Brendan Eich, 1995, .js], [С#, Microsoft, 2000, .сs]]
1
2
3
4
5
6- Запишите данные в новый файл:
data_change_2.csv
.
- редактирует годы в третьем столбце:
Напишите программу, которая считывает данные
data.csv
файла и обрабатывает данные:- редактирует годы в третьем столбце:
91, 95, 83
преобразует в 1991, 1995, 1983. - редактирует написание первой колонки, преобразует написание названий языков в написание большими буквами.
- удаляет строку:
C++, Bjarne Stroustrup, 1983, .cpp
- добавьте данные о языке javascript:
JAVASCRIPT, Brendan Eich, 1995, .js
,C#, Microsoft, 2000, .сs
- вывести результат в консоль. Должен получиться подобно:
Programming language, Designed by, Appeared, Extension PYTHON, Guido van Rossum, 1991, .py JAVA, James Gosling, 1995, .java JAVASCRIPT, Brendan Eich, 1995, .js С#, Microsoft, 2000, .сs
1
2
3
4
5- Запишите данные в новый файл:
data_change_3.json
.
- редактирует годы в третьем столбце:
Написать программу генерации интерфейса
csv
файла. С кнопками открытия и сохрания новый вcsv
илиjson
файл:- при нажатии кнопки открыть файл отктывается диалоговое окно выбора файла, при выборе
csv
файла отрисовывает содержимое файла в отдельных однострочных текстовых полях. - возможно поизводить редактирование полей.
- запись измененных данных в новый файл
csv
илиjson
.
- при нажатии кнопки открыть файл отктывается диалоговое окно выбора файла, при выборе
Добавить функциональность к предыдущей программе:
- создать две кнопки: добавления новой пустой строки и/или колонки в таблицу, с поддержкой редактирования данных внутри них.
- создать две кнопки: удаления последней пустой строки и/или колонки в таблице, с проверкой тустоты или предупреждением об удалении (ок/отмена), если в удаляемых ячейках содержаться данные.
- реализовать правильное сохранение данных без учета пустых колонок и строк. Запись данных в новый файл
csv
илиjson
.
Добавить функциональность к предыдущей программе:
- реализовать автоматическое добавление пусных колонки и строчки, если в соседних колонках и строках содежатся данные. Т.е. крайние колонка и строка всегда добавлюятся автоматически и остаются пустыми, для удобства редактирования.
- реализовать автоматическое удаление пусных колонки и строчки.Eсли последние две строки или колонки оказываются пустыми, то удаляется последняя строка или колонка соответсвенно.
- добавить сортировку по алфавиту прямую и обратную для каждой колонки. При сортироке по колонке заполнение остальных строк таблицы меняются соответственно.
- реализовать правильное сохранение данных без учета пустых колонок и строк. Запись данных в новый файл
csv
илиjson
.