Рубрики
Без рубрики

Чтение и запись CSV-файлов на Python

Автор оригинала: Scott Robinson.

Что такое CSV-файл?

Файл CSV (значения, разделенные запятыми) – это файл, который использует определенное форматирование для хранения данных. Этот формат файла организует информацию, содержащую по одной записи на строку, причем каждое поле (столбец) разделяется разделителем. Наиболее часто используемым разделителем обычно является запятая.

Этот формат настолько распространен, что фактически был стандартизирован в RFC 4180 . Однако этот стандарт не всегда соблюдается, и существует отсутствие универсального использования стандарта. Точный используемый формат иногда может зависеть от приложения, для которого он используется.

CSV-файлы обычно используются, потому что они легко читаются и управляются, имеют небольшой размер и быстро обрабатываются/передаются. Из-за этих преимуществ они часто используются в программных приложениях, начиная от интернет-магазинов электронной коммерции и заканчивая мобильными приложениями и настольными инструментами. Например, Magento, платформа электронной коммерции, известна своей поддержкой CSV .

Кроме того, многие приложения, такие как Microsoft Excel, Notepad и Google Docs, могут использоваться для импорта или экспорта CSV-файлов.

Модуль csv Python

Модуль csv реализует классы для работы с CSV-файлами. Он ориентирован на формат, который предпочитает Microsoft Excel. Однако его функциональность достаточно обширна для работы с CSV-файлами, использующими различные разделители и символы кавычек.

Этот модуль предоставляет функции reader и writer , которые работают последовательно. Он также имеет классы DictReader и DictWriter для управления данными CSV в виде объекта словаря Python.

Этот модуль предоставляет функции || reader || и || writer || , которые работают последовательно. Он также имеет классы || DictReader || и || DictWriter || для управления данными CSV в виде объекта словаря Python.

Метод csv.reader(csvfile,, **fmt params) можно использовать для извлечения данных из файла, содержащего данные в формате CSV.

Он принимает следующие параметры:

  • csv file : Объект, поддерживающий протокол итератора, который в данном случае обычно является файловым объектом для CSV-файла
  • диалект (необязательно): Название используемого диалекта (которое будет объяснено в последующих разделах)
  • fmt params (необязательно): Параметры форматирования, которые будут перезаписывать параметры, указанные в диалекте

Этот метод возвращает объект reader, который можно перебирать, чтобы получить строки вашего CSV. Данные считываются в виде списка строк. Если мы зададим ЧИСЛОВОЙ формат QUOTE_NON, то значения без кавычек преобразуются в значения с плавающей запятой.

Пример использования этого метода приведен в разделе Чтение CSV-файлов этой статьи.

Пример использования этого метода приведен в разделе Чтение CSV-файлов этой статьи.

Метод csv.writer(csvfile,, **fmt params) , который аналогичен методу reader, описанному выше, является методом, который позволяет нам записывать данные в файл в формате CSV.

Этот метод принимает следующие параметры:

  • csv file : Любой объект с методом write () , который в данном случае обычно является файловым объектом
  • диалект (необязательно): Имя используемого диалекта
  • fmt params (необязательно):Параметры форматирования, которые будут перезаписывать параметры, указанные в диалекте

Обратите внимание на этот метод: если указанный параметр csv-файл является объектом file, он должен быть открыт с помощью newline=" . Если это не указано, новые строки внутри полей в кавычках будут интерпретироваться неправильно, и в зависимости от рабочей платформы могут быть добавлены дополнительные символы, такие как ‘\r’.

csv.DictReader и csv.DictWriter

Модуль csv также предоставляет нам классы DictReader и DictWriter , которые позволяют нам читать и записывать файлы с помощью объектов словаря.

Класс DictReader() работает аналогично csv.reader , но в Python 2 он сопоставляет данные со словарем, а в Python 3-с OrderedDict . Ключи задаются параметром field-names.

И точно так же , как DictReader , класс DictWriter() работает очень похоже на метод csv.writer , хотя он сопоставляет словарь с выходными строками. Однако имейте в виду, что поскольку словари Python не упорядочены, мы не можем предсказать порядок строк в выходном файле.

Оба этих класса включают в себя необязательный параметр для использования диалектов.

Диалекты

A dialect в контексте чтения и записи Csv-это конструкция , которая позволяет создавать, хранить и повторно использовать различные параметры форматирования для ваших данных.

Python предлагает два различных способа задания параметров форматирования. Первый заключается в объявлении подкласса этого класса, который содержит определенные атрибуты. Второй способ заключается в непосредственном указании параметров форматирования с использованием тех же имен, что и в классе Dialect .

Диалект поддерживает несколько атрибутов. Наиболее часто используемые:

  • Dialect.delimiter : Используется в качестве разделительного символа между полями. Значение по умолчанию-запятая (,).
  • Dialect.quotechar : Используется для цитирования полей, содержащих специальные символы. По умолчанию используется двойная кавычка (“).
  • Dialect.lineterminator : Используется для создания новых строк. По умолчанию используется ‘\r\n’.

Используйте этот класс, чтобы указать модулю csv , как взаимодействовать с вашими нестандартными данными CSV.

Версии

Одна важная вещь, которую следует отметить, если вы используете Python 2.7: в этой версии Python не так просто поддерживать ввод Unicode, поэтому вам может потребоваться убедиться, что все ваши входные данные находятся в UTF-8 или печатаемых символах ASCII.

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

Мы можем легко создать CSV-файл с помощью текстового редактора или даже Excel. В приведенном ниже примере файл Excel содержит комбинацию чисел (1, 2 и 3) и слов (Доброе утро, Добрый день, Добрый вечер), каждое из которых находится в отдельной ячейке.

Чтобы сохранить этот файл в формате CSV, нажмите кнопку File->Save As , затем в окне Save As выберите “Значения, разделенные запятыми (.csv)” в раскрывающемся списке Format . Сохраните его как csv example.csv для последующего использования.

Структуру CSV-файла можно увидеть с помощью текстового редактора, такого как Notepad или Sublime Text. Здесь мы можем получить те же значения, что и в файле Excel, но разделенные запятыми.

1,2,3
Good morning,Good afternoon,Good evening

Мы будем использовать этот файл в следующих примерах.

Мы также можем изменить разделитель на что-то другое, чем запятая, например на косую черту (‘/’). Внесите это изменение в файл выше, заменив все запятые косыми чертами, и сохраните его как csv пример 2.csv для последующего использования. Это будет выглядеть следующим образом:

1/2/3
Good morning/Good afternoon/Good evening

Это также допустимые данные CSV, если мы используем правильный диалект и форматирование для чтения/записи данных, что в данном случае потребует разделителя’/’.

Чтение CSV-файлов

Простой CSV-файл

В этом примере мы покажем, как вы можете прочитать файл csv example.csv, который мы создали и объяснили в предыдущем разделе. Код выглядит следующим образом:

import csv

with open('csvexample.csv', newline='') as myFile:
    reader = csv.reader(myFile)
    for row in reader:
        print(row)

В этом коде мы открываем наш CSV-файл как myFile , а затем используем метод csv.reader для извлечения данных в объект reader , который затем можно перебирать, чтобы получить каждую строку наших данных. В этом примере, чтобы показать, что данные действительно были прочитаны, мы просто распечатываем их на консоли.

Если мы сохраним код в файле с именем reader.py и мы его запускаем, результат должен показать следующее:

$ python reader.py
['1', '2', '3']
['Good morning', 'Good afternoon', 'Good evening']

Как видно из выполнения этого кода, мы получаем содержимое файла csvexample.csv, которое выводится на консоль, за исключением того, что теперь оно находится в структурированном виде, с которым нам легче работать в нашем коде.

Изменение разделителя

Модуль csv позволяет нам читать CSV-файлы, даже если некоторые характеристики формата файла отличаются от стандартного форматирования. Например, мы можем прочитать файл с другим разделителем, таким как табуляции, точки или даже пробелы (на самом деле любой символ). В нашем другом примере, csv example 2.csv, мы заменили запятую прямой косой чертой, чтобы продемонстрировать это.

Чтобы выполнить ту же задачу, что и выше, с этим новым форматированием, мы должны изменить код, чтобы указать новый используемый разделитель. В этом примере мы сохранили код в файле с именем reader2.py. Модифицированная программа выглядит следующим образом:

import csv

with open('csvexample2.csv', newline='') as myFile:
    reader = csv.reader(myFile, delimiter='/', quoting=csv.QUOTE_NONE)
    for row in reader:
        print(row)

Как видно из приведенного выше кода, мы изменили третью строку кода, добавив параметр delimiter и присвоив ему значение’/’. Это указывает методу рассматривать все символы ‘/’ как разделительную точку между данными столбца.

Мы также добавили параметр quoting и присвоили ему значение csv.QUOTE_NONE , что означает, что метод не должен использовать никаких специальных кавычек при синтаксическом анализе. Как и ожидалось, результат аналогичен предыдущему примеру:

$ python reader2.py
['1', '2', '3']
['Good morning', 'Good afternoon', 'Good evening']

Как видите, благодаря небольшим изменениям в коде мы все равно получаем тот же ожидаемый результат.

Создание диалекта

Модуль csv позволяет нам создать диалект с конкретными характеристиками нашего CSV-файла. Таким образом, тот же результат сверху также может быть достигнут с помощью следующего кода:

import csv

csv.register_dialect('myDialect', delimiter='/', quoting=csv.QUOTE_NONE)

with open('csvexample2.csv', newline='') as myFile:
   reader = csv.reader(myFile, dialect='myDialect')
   for row in reader:
       print(row) 

Здесь мы создаем и регистрируем наш собственный именованный диалект, который в данном случае использует те же параметры форматирования, что и раньше (косая черта и отсутствие кавычек). Затем мы указываем в csv.reader , что хотим использовать зарегистрированный нами диалект, передавая его имя в качестве параметра dialect .

Если мы сохраним этот код в файле с именем reader3.py и запустите его, результат будет следующим:

$ python reader3.py
['1', '2', '3']
['Good morning', 'Good afternoon', 'Good evening']

Опять же, этот вывод точно такой же, как и выше, что означает, что мы правильно проанализировали нестандартные CSV-данные.

Запись в CSV-файлы

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

Код в приведенном ниже примере создает список данных, причем каждый элемент внешнего списка представляет собой строку в CSV-файле. Затем ваш код открывает CSV-файл с именем csv example 3.csv, создает объект writer и записывает данные в файл с помощью метода writerows () .

import csv

myData = [[1, 2, 3], ['Good Morning', 'Good Evening', 'Good Afternoon']]
myFile = open('csvexample3.csv', 'w')
with myFile:
   writer = csv.writer(myFile)
   writer.writerows(myData)

Полученный файл, csv example 3.csv, должен иметь следующий текст:

1,2,3
Good Morning,Good Evening,Good Afternoon

Объект writer также обслуживает другие форматы CSV. В следующем примере создается и используется диалект с разделителем ‘/’:

import csv

myData = [[1, 2, 3], ['Good Morning', 'Good Evening', 'Good Afternoon']]

csv.register_dialect('myDialect', delimiter='/', quoting=csv.QUOTE_NONE)

myFile = open('csvexample4.csv', 'w')
with myFile:
   writer = csv.writer(myFile, dialect='myDialect')
   writer.writerows(myData)

Аналогично нашему примеру “чтения”, мы создаем диалект таким же образом (через csv.register_dialect() ) и используем его таким же образом, указывая его по имени.

И снова запуск приведенного выше кода приводит к следующему выходу в ваш новый csv-файл example 4.csv:

1/2/3
Good Morning/Good Evening/Good Afternoon

Использование словарей

Во многих случаях наши данные не будут отформатированы в виде 2D-массива (как мы видели в предыдущих примерах), и было бы неплохо, если бы мы лучше контролировали данные, которые мы читаем. Чтобы помочь решить эту проблему, модуль csv предоставляет вспомогательные классы, которые позволяют нам читать/записывать ваши CSV-данные в/из объектов словаря, что значительно облегчает работу с данными.

Взаимодействие с вашими данными таким образом гораздо более естественно для большинства приложений Python и будет легче интегрироваться в ваш код благодаря знакомству с dict .

Чтение CSV-файла с помощью ДиктРедера

Используя ваш любимый текстовый редактор, создайте CSV-файл с именем countries.csv со следующим содержимым:

country,capital
France,Paris
Italy,Rome
Spain,Madrid
Russia,Moscow

Теперь формат этих данных может выглядеть немного иначе, чем в наших предыдущих примерах. Первая строка в этом файле содержит имена полей/столбцов, которые обеспечивают метку для каждого столбца данных. Строки в этом файле содержат пары значений (страна, капитал), разделенных запятой. Эти метки необязательны, но, как правило, очень полезны, особенно когда вам приходится самостоятельно просматривать эти данные.

Чтобы прочитать этот файл, мы создаем следующий код:

import csv  

with open('countries.csv') as myFile:  
    reader = csv.DictReader(myFile)
    for row in reader:
        print(row['country'])

Мы по-прежнему просматриваем каждую строку данных, но обратите внимание, что теперь мы можем получить доступ к столбцам каждой строки по их метке, которая в данном случае является страной. Если бы мы захотели, мы также могли бы получить доступ к капиталу с помощью row['capital'] .

Запуск кода приводит к следующему:

$ python readerDict.py
France
Italy
Spain
Russia

Запись в файл с помощью программы DictWriter

Мы также можем создать CSV-файл с помощью наших словарей. В приведенном ниже коде мы создаем словарь с полями страна и капитал. Затем мы создаем объект writer , который записывает данные в наш файл countries.csv, содержащий набор полей, ранее определенных с помощью списка myFields .

После этого мы сначала пишем строку заголовка с помощью метода writeheader () , а затем пары значений с помощью метода writerow () . Позиция каждого значения в строке задается с помощью метки столбца. Вы, вероятно, можете себе представить, насколько это полезно, когда у вас есть десятки или даже сотни столбцов в ваших CSV-данных.

import csv

myFile = open('countries.csv', 'w')
with myFile:    
    myFields = ['country', 'capital']
    writer = csv.DictWriter(myFile, fieldnames=myFields)    
    writer.writeheader()
    writer.writerow({'country' : 'France', 'capital': 'Paris'})
    writer.writerow({'country' : 'Italy', 'capital': 'Rome'})
    writer.writerow({'country' : 'Spain', 'capital': 'Madrid'})
    writer.writerow({'country' : 'Russia', 'capital': 'Moscow'})

И, наконец, запуск этого кода дает нам правильный вывод CSV с метками и всем прочим:

country,capital
France,Paris
Italy,Rome
Spain,Madrid
Russia,Moscow

Вывод

CSV-файлы-это удобный формат хранения файлов, который многие разработчики используют в своих проектах. Они небольшие, просты в управлении и широко используются при разработке программного обеспечения. К счастью для вас, Python имеет специальный модуль для них, который предоставляет гибкие методы и классы для управления CSV-файлами простым и эффективным способом.

В этой статье мы показали вам, как использовать модуль csv Python для чтения и записи CSV-данных в файл. В дополнение к этому мы также показали, как создавать диалекты и использовать вспомогательные классы, такие как DictReader и DictWriter для чтения и записи CSV из/в dict объекты.