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

Что такое файл CSV? Файл CSV (значения, разделенные запятыми) - это файл, в котором для хранения данных используется определенное форматирование. Этот формат файла организует информацию, содержащую по одной записи в строке, причем каждое поле (столбец) разделено разделителем. Чаще всего используется разделитель - запятая. Этот формат настолько распространен, что фактически стандартизирован в RFC 4180 [https://tools.ietf.org/html/rfc4180]. Однако этот стандарт не всегда соблюдается, а универсального стандарта не существует.

Что такое файл 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.

csv.reader

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

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

  • csvfile : объект, поддерживающий протокол итератора, который в данном случае обычно является файловым объектом для файла CSV.
  • dialect (необязательно): название используемого диалекта (которое будет объяснено в следующих разделах).
  • fmtparams (необязательно): параметры форматирования, которые перезаписывают параметры, указанные в диалекте.

Этот метод возвращает объект-читатель, который можно повторять, чтобы получить строки вашего CSV. Данные читаются как список строк. Если мы укажем формат QUOTE_NONNUMERIC, значения без кавычек будут преобразованы в значения с плавающей запятой.

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

csv.writer

Метод csv.writer(csvfile, dialect='excel', **fmtparams) , который похож на метод чтения, который мы описали выше, - это метод, который позволяет нам записывать данные в файл в формате CSV.

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

  • csvfile : любой объект с write() , который в данном случае обычно является файловым объектом.
  • dialect (необязательно): название используемого диалекта.
  • fmtparams (необязательно): параметры форматирования, которые перезаписывают параметры, указанные в диалекте.

csvfile этом методе: если указанный параметр csvfile является файловым объектом, он должен быть открыт с newline='' . Если это не указано, новые строки внутри цитируемых полей не будут интерпретироваться правильно, и в зависимости от рабочей платформы могут быть добавлены дополнительные символы, такие как '\ r'.

csv.DictReader и csv.DictWriter

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

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

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

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

Диалекты

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

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

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) и слов (Доброе утро, Добрый день, Добрый вечер), каждое из которых находится в отдельной ячейке.

{.ezlazyload .img-responsive}

Чтобы сохранить этот файл в формате CSV, нажмите « Файл»> «Сохранить как» , затем в окне « Сохранить как» выберите «Значения, разделенные запятыми (.csv)» в раскрывающемся списке «Формат». Сохраните его как csvexample.csv для дальнейшего использования.

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

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

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

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

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

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

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

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

В этом примере мы покажем, как вы можете прочитать файл csvexample.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, даже если некоторые характеристики формата файла отличаются от стандартного форматирования. Например, мы можем прочитать файл с другим разделителем, таким как табуляция, точка или даже пробел (на самом деле любой символ). В нашем другом примере, csvexample2.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 и присвоив ему значение '/'. Это указывает методу обрабатывать все символы '/' как точку разделения между данными столбца.

Мы также добавили параметр цитирования и присвоили ему значение 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 с именем csvexample3.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) 

В результате файл csvexample3.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() ) и используем его таким же образом, определяя его по имени.

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

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

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

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

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

Чтение CSV-файла с помощью DictReader

Используя свой любимый текстовый редактор, создайте CSV-файл с именем country.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

comments powered by Disqus