Appearance
Файл 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:
py
import csv
with open('data.csv') as file_csv:
for row in csv.reader(file_csv):
print(row)Модуль csv.writer
Этот модуль похож на модуль csv.reader и используется для записи данных в CSV. Требуется три параметра:
csvfile: это может быть любой объект с методомwrite().dialect = 'excel': необязательный параметр, используемый для определения набора параметров, специфичных для конкретного CSV.fmtparam: необязательный параметр, который можно использовать для переопределения существующих параметров форматирования.
Классы DictReader и DictWriter
DictReader и DictWriter - это классы, доступные в Python для чтения и записи в CSV. Хотя они и похожи на функции чтения и записи, эти классы используют объекты словаря для чтения и записи в CSV-файлы.
DictReader
Он создает объект, который отображает прочитанную информацию в словарь, ключи которого задаются параметром fieldnames. Этот параметр является необязательным, но если он не указан в файле, данные первой строки становятся ключами словаря.
Пример:
py
import csv
with open('data.csv') as csv_file:
reader = csv.DictReader(csv_file)
for row in reader:
print(row)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-файла с помощью csv.reader()
py
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)В приведенном выше коде мы импортируем модуль CSV, а затем открываем наш файл CSV в виде file_csv. Затем мы определяем объект reader и используем метод csv.reader для извлечения данных в объект. Затем мы перебираем объект reader и извлекаем каждую строку наших данных.
Мы показываем прочитанные данные, печатая их содержимое на консоль. Мы также указали обязательные параметры, такие как разделитель, кавычка и цитирование.
Вывод:
py
['first_name', 'last_name', 'Grade']
['Alex', 'Brian', 'B']
['Rachael', 'Rodriguez', 'A']
['Tom', 'smith', 'C']Чтение CSV-файла с помощью DictReader
Как мы упоминали выше, DictWriter позволяет нам читать CSV-файл, отображая данные в словарь вместо строк, как в случае с модулем csv.reader. Хотя имя поля является необязательным параметром, важно всегда помечать столбцы для удобства чтения.
Вот как читать CSV, используя класс DictWriter().
py
import csv
results = []
with open('example.csv') as File:
reader = csv.DictReader(File)
for row in reader:
results.append(row)
print resultsСначала мы импортируем модуль 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.
py
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")Сначала мы импортируем модуль csv, и функция writer() создаст объект, подходящий для записи. Чтобы перебрать данные по строкам, нам нужно использовать функцию writerows().
Вот наш CSV с данными, которые мы записали в него.
| first_name | last_name | Grade |
|---|---|---|
| Alex | Brian | B |
| Rachael | Rodriguez | A |
| Tom | smith | C |
Запись в файл CSV с использованием DictWriter
Давайте напишем следующие данные в CSV.
py
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'}]Код, показан ниже:
py
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")Сначала мы определим fieldnames, которые будут представлять заголовки каждого столбца в файле CSV. Метод .writerrow() будет записывать по одной строке за раз. Если вы хотите записать все данные одновременно, вы будете использовать метод .writerrows().
Вот как можно записать все строки одновременно.
py
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")Упражнения
Создайне 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 - вывести результат в консоль. Должен получиться подобно:
csv[[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]]- Запишите данные в новый файл:
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 - вывести результат в консоль. Должен получиться подобно:
csv[[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]]- Запишите данные в новый файл:
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 - вывести результат в консоль. Должен получиться подобно:
csvProgramming language, Designed by, Appeared, Extension PYTHON, Guido van Rossum, 1991, .py JAVA, James Gosling, 1995, .java JAVASCRIPT, Brendan Eich, 1995, .js С#, Microsoft, 2000, .сs- Запишите данные в новый файл:
data_change_3.json.
- редактирует годы в третьем столбце:
Написать программу генерации интерфейса
csvфайла. С кнопками открытия и сохрания новый вcsvилиjsonфайл:- при нажатии кнопки открыть файл отктывается диалоговое окно выбора файла, при выборе
csvфайла отрисовывает содержимое файла в отдельных однострочных текстовых полях. - возможно поизводить редактирование полей.
- запись измененных данных в новый файл
csvилиjson.
- при нажатии кнопки открыть файл отктывается диалоговое окно выбора файла, при выборе
Добавить функциональность к предыдущей программе:
- создать две кнопки: добавления новой пустой строки и/или колонки в таблицу, с поддержкой редактирования данных внутри них.
- создать две кнопки: удаления последней пустой строки и/или колонки в таблице, с проверкой тустоты или предупреждением об удалении (ок/отмена), если в удаляемых ячейках содержаться данные.
- реализовать правильное сохранение данных без учета пустых колонок и строк. Запись данных в новый файл
csvилиjson.
Добавить функциональность к предыдущей программе:
- реализовать автоматическое добавление пусных колонки и строчки, если в соседних колонках и строках содежатся данные. Т.е. крайние колонка и строка всегда добавлюятся автоматически и остаются пустыми, для удобства редактирования.
- реализовать автоматическое удаление пусных колонки и строчки.Eсли последние две строки или колонки оказываются пустыми, то удаляется последняя строка или колонка соответсвенно.
- добавить сортировку по алфавиту прямую и обратную для каждой колонки. При сортироке по колонке заполнение остальных строк таблицы меняются соответственно.
- реализовать правильное сохранение данных без учета пустых колонок и строк. Запись данных в новый файл
csvилиjson.