Файл CSV

CSV-файл (Comma Separated Values – переменные, разделенные запятыми) - это тип обычного текстового файла, в котором для упорядочения табличных данных используется определенная структура.

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

Пример файла CSV

Данные в форме таблиц также называются CSV - буквально «значения, разделенные запятыми». Это текстовый формат, предназначенный для представления табличных данных. Каждая строка файла - это одна строка таблицы. Значения отдельных столбцов разделяются символом-разделителем - запятой (,), точкой с запятой (😉 или другим символом. CSV легко читается и обрабатывается Python.

Рассмотрим следующую таблицу.

Данные ввиде таблицы
Programming languageDesigned byAppearedExtension
PythonGuido van Rossum1991.py
JavaJames Gosling1995.java
C++Bjarne Stroustrup1983.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)
1
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)
1
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_namelast_nameGrade
AlexBrianB
RachaelRodriguezA
TomsmithC

Ниже приведен код для чтения данных в нашем CSV с использованием функции csv.reader и класса csv.DictReader.

Чтение CSV-файла с помощью csv.reader()

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)
1
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']
1
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
1
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")
1
2
3
4
5
6
7
8
9
10
11
12

Сначала мы импортируем модуль csv, и функция writer() создаст объект, подходящий для записи. Чтобы перебрать данные по строкам, нам нужно использовать функцию writerows().

Вот наш CSV с данными, которые мы записали в него.

first_namelast_nameGrade
AlexBrianB
RachaelRodriguezA
TomsmithC

Запись в файл 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'}]
1
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")
1
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")
1
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
  1. Напишите программу, которая используя методы 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.
  2. Напишите программу, которая используя методы 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.
  3. Напишите программу, которая считывает данные 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.
  4. Написать программу генерации интерфейса csv файла. С кнопками открытия и сохрания новый в csv или json файл:

    • при нажатии кнопки открыть файл отктывается диалоговое окно выбора файла, при выборе csv файла отрисовывает содержимое файла в отдельных однострочных текстовых полях.
    • возможно поизводить редактирование полей.
    • запись измененных данных в новый файл csv или json.
  5. Добавить функциональность к предыдущей программе:

    • создать две кнопки: добавления новой пустой строки и/или колонки в таблицу, с поддержкой редактирования данных внутри них.
    • создать две кнопки: удаления последней пустой строки и/или колонки в таблице, с проверкой тустоты или предупреждением об удалении (ок/отмена), если в удаляемых ячейках содержаться данные.
    • реализовать правильное сохранение данных без учета пустых колонок и строк. Запись данных в новый файл csv или json.
  6. Добавить функциональность к предыдущей программе:

    • реализовать автоматическое добавление пусных колонки и строчки, если в соседних колонках и строках содежатся данные. Т.е. крайние колонка и строка всегда добавлюятся автоматически и остаются пустыми, для удобства редактирования.
    • реализовать автоматическое удаление пусных колонки и строчки.Eсли последние две строки или колонки оказываются пустыми, то удаляется последняя строка или колонка соответсвенно.
    • добавить сортировку по алфавиту прямую и обратную для каждой колонки. При сортироке по колонке заполнение остальных строк таблицы меняются соответственно.
    • реализовать правильное сохранение данных без учета пустых колонок и строк. Запись данных в новый файл csv или json.