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