В этом уроке мы научимся читать CSV-файлы разных форматов в Python с помощью примеров.
Для этой задачи мы будем использовать модуль csv, встроенный в Python. Но сначала нам нужно будет импортировать модуль как:
Мы уже рассмотрели основы использования модуля csv для чтения и записи в файлы CSV. Если вы не знаете, как использовать модуль csv, ознакомьтесь с нашим руководством по Python CSV: чтение и запись файлов CSV
Давайте рассмотрим простой пример использования csv.reader(), чтобы освежить ваши знания.
Здесь мы открыли файл innovators.csv в режиме чтения с помощью функции open().
Чтобы узнать больше об открытии файлов в Python, посетите: Ввод/вывод файлов Python
Затем csv.reader() используется для чтения файла, который возвращает итерируемый объект чтения.
Затем объект чтения повторяется с помощью цикла for для печати содержимого каждой строки.
Теперь мы рассмотрим файлы CSV в разных форматах. Затем мы узнаем, как настроить функцию csv.reader() для их чтения.
По умолчанию в качестве разделителя в CSV-файле используется запятая. Однако некоторые файлы CSV могут использовать разделители, отличные от запятой. Несколько популярных из них | и \т .
Предположим, файл innovators.csv в примере 1 использует табуляцию в качестве разделителя. Чтобы прочитать файл, мы можем передать дополнительный параметр-разделитель в функцию csv.reader().
Давайте рассмотрим пример.
Как мы видим, необязательный параметр delimiter = '\t' помогает указать объект чтения, из которого CSV-файл, из которого мы читаем, имеет табуляцию в качестве разделителя.
Некоторые CSV-файлы могут содержать пробел после разделителя. Когда мы используем функцию csv.reader() по умолчанию для чтения этих CSV-файлов, мы также получим пробелы в выводе.
Чтобы удалить эти начальные пробелы, нам нужно передать дополнительный параметр skipinitialspace. Давайте рассмотрим пример:
Эта программа аналогична другим примерам, но имеет дополнительный параметр skipinitialspace, для которого задано значение True.
Это позволяет объекту чтения узнать, что записи имеют начальные пробелы. В результате начальные пробелы, которые присутствовали после разделителя, удаляются.
Некоторые файлы CSV могут содержать кавычки вокруг каждой или некоторых записей.
Использование csv.reader() в минимальном режиме приведет к выводу с кавычками.
Чтобы удалить их, нам придется использовать еще один необязательный параметр, называемый цитированием.
Давайте рассмотрим пример того, как читать приведенную выше программу.
Как видите, мы передали csv.QUOTE_ALL в параметр цитирования. Это константа, определяемая модулем csv.
csv.QUOTE_ALL указывает объекту чтения, что все значения в CSV-файле заключены в кавычки.
Есть 3 другие предопределенные константы, которые вы можете передать в параметр цитирования:
Обратите внимание, что в примере 4 мы передали несколько параметров (цитирование и skipinitialspace) в функцию csv.reader().
Эта практика приемлема при работе с одним или двумя файлами. Но это сделает код более избыточным и уродливым, как только мы начнем работать с несколькими CSV-файлами с похожими форматами.
Чтобы решить эту проблему, модуль csv предлагает диалект в качестве дополнительного параметра.
Диалект помогает сгруппировать многие определенные шаблоны форматирования, такие как разделитель , skipinitialspace , цитирование , escapechar, в одно диалектное имя.
Затем его можно передать в качестве параметра нескольким экземплярам записи или чтения.
Файл CSV имеет начальные пробелы, кавычки вокруг каждой записи и использует символ | разделитель.
Вместо того, чтобы передавать три отдельных шаблона форматирования, давайте посмотрим, как использовать диалекты для чтения этого файла.
Из этого примера видно, что функция csv.register_dialect() используется для определения пользовательского диалекта. Он имеет следующий синтаксис:
Для пользовательского диалекта требуется имя в виде строки. Другие спецификации можно выполнить либо путем передачи подкласса класса Dialect, либо с помощью отдельных шаблонов форматирования, как показано в примере.
При создании объекта для чтения мы передаем dialect='myDialect', чтобы указать, что экземпляр для чтения должен использовать этот конкретный диалект.
Преимущество использования диалекта заключается в том, что он делает программу более модульной. Обратите внимание, что мы можем повторно использовать «myDialect» для открытия других файлов без повторного указания формата CSV.
Объекты класса csv.DictReader() можно использовать для чтения CSV-файла как словаря.
Имя | Возраст | Профессия |
---|
Джек | 23 | Доктор |
Миллер | 22 | Инженер | tr>
таблица>
Давайте посмотрим, как можно использовать csv.DictReader().
Вывод
Как мы видим, записи первой строки являются ключами словаря. А записи в других строках являются значениями словаря.
Здесь csv_file — это объект csv.DictReader(). Объект можно перебирать с помощью цикла for. csv.DictReader() возвращал тип OrderedDict для каждой строки. Вот почему мы использовали dict() для преобразования каждой строки в словарь.
Обратите внимание, что мы явно использовали метод dict() для создания словарей внутри цикла for.
Примечание. Начиная с Python 3.8, csv.DictReader() возвращает словарь для каждой строки, и нам не нужно явно использовать dict().
Полный синтаксис класса csv.DictReader():
Чтобы узнать об этом подробнее, посетите: класс Python csv.DictReader()
Использование класса csv.Sniffer
Класс Sniffer используется для определения формата CSV-файла.
Класс Sniffer предлагает два метода:
- sniff(sample, delimiters=None) — эта функция анализирует заданный образец текста CSV и возвращает подкласс диалекта, содержащий все полученные параметры.
Необязательный параметр разделителей можно передать как строку, содержащую возможные допустимые символы-разделители.
- has_header(sample) – эта функция возвращает значение True или False в зависимости от того, содержит ли образец CSV-файла первую строку в качестве заголовков столбцов.
Давайте рассмотрим пример использования этих функций:
Пример 7. Использование csv.Sniffer() для определения диалекта CSV-файлов
Предположим, у нас есть CSV-файл (office.csv) со следующим содержимым:
Давайте посмотрим, как мы можем определить формат этого файла, используя класс csv.Sniffer():
Вывод
Как видите, мы прочитали только 64 символа из файла office.csv и сохранили его в образце переменной.
Затем этот образец был передан в качестве параметра функции Sniffer().has_header(). Он пришел к выводу, что первая строка должна иметь заголовки столбцов. Таким образом, он вернул True, который затем был распечатан.
Аналогичным образом образец также был передан в функцию Sniffer().sniff(). Он вернул все выведенные параметры как подкласс диалекта, который затем был сохранен в переменной deduced_dialect.
Позже мы повторно открыли CSV-файл и передали переменную deduced_dialect в качестве параметра функции csv.reader() .
В файле office.csv параметры delimiter , quoting и skipinitialspace правильно предсказывались без нашего явного упоминания.
Примечание. Модуль csv также можно использовать для файлов с другими расширениями (например, .txt), если их содержимое имеет правильную структуру.
Давайте посмотрим правде в глаза: вам нужно вводить информацию в свои программы и из них не только с помощью клавиатуры и консоли. Обмен информацией через текстовые файлы — распространенный способ обмена информацией между программами. Одним из самых популярных форматов для обмена данными является формат CSV. Но как вы его используете?
Давайте проясним одну вещь: вам не нужно (и вы не будете) создавать собственный парсер CSV с нуля. Есть несколько вполне приемлемых библиотек, которые вы можете использовать. Библиотека Python csv подойдет для большинства случаев. Если ваша работа требует большого количества данных или числового анализа, в библиотеке pandas также есть возможности анализа CSV, которые справятся с остальными.
В этой статье вы узнаете, как читать, обрабатывать и анализировать CSV из текстовых файлов с помощью Python. Вы увидите, как работают CSV-файлы, изучите важнейшую библиотеку CSV, встроенную в Python, и увидите, как работает парсинг CSV с помощью библиотеки pandas.
Итак, приступим!
Бесплатная загрузка: получите образец главы из книги Основы Python: практическое введение в Python 3, чтобы узнать, как перейти от начального к среднему уровню владения Python с помощью полной учебной программы, актуальной для Python 3.8.
Пройдите тест: проверьте свои знания с помощью нашей интерактивной викторины «Чтение и запись файлов CSV в Python». По завершении вы получите балл, чтобы вы могли отслеживать свой прогресс в обучении с течением времени:
Что такое CSV-файл?
Файл CSV (файл значений, разделенных запятыми) – это тип обычного текстового файла, в котором используется определенная структура для организации табличных данных. Поскольку это обычный текстовый файл, он может содержать только фактические текстовые данные, другими словами, печатные символы ASCII или Unicode.
Структура CSV-файла определяется его именем. Обычно файлы CSV используют запятую для разделения каждого конкретного значения данных. Вот как выглядит эта структура:
Обратите внимание, что каждый фрагмент данных отделяется запятой. Обычно первая строка идентифицирует каждую часть данных, другими словами, имя столбца данных. Каждая последующая строка представляет собой фактические данные и ограничивается только размерами файла.
Вообще, символ-разделитель называется разделителем, и используется не только запятая. Другие популярные разделители включают символы табуляции (\t), двоеточия (:) и точки с запятой (;). Для правильного анализа CSV-файла нам необходимо знать, какой разделитель используется.
Откуда берутся CSV-файлы?
Файлы CSV обычно создаются программами, обрабатывающими большие объемы данных. Это удобный способ экспортировать данные из электронных таблиц и баз данных, а также импортировать или использовать их в других программах. Например, вы можете экспортировать результаты программы интеллектуального анализа данных в файл CSV, а затем импортировать его в электронную таблицу для анализа данных, создания графиков для презентации или подготовки отчета к публикации.
С файлами CSV очень легко работать программно. Любой язык, поддерживающий ввод текстовых файлов и работу со строками (например, Python), может напрямую работать с CSV-файлами.
Синтаксический анализ файлов CSV с помощью встроенной библиотеки CSV Python
Библиотека csv предоставляет функции как для чтения, так и для записи в файлы CSV. Разработанный для работы с CSV-файлами, сгенерированными в Excel, он легко адаптируется для работы с различными форматами CSV. Библиотека csv содержит объекты и другой код для чтения, записи и обработки данных из и в файлы CSV.
Чтение файлов CSV с помощью csv
Чтение из CSV-файла выполняется с помощью объекта чтения. Файл CSV открывается как текстовый файл с помощью встроенной в Python функции open(), которая возвращает объект файла. Затем он передается считывателю , который выполняет всю тяжелую работу.
Вот файл employee_birthday.txt:
Вот код для чтения:
В результате получается следующий результат:
Каждая строка, возвращаемая средством чтения, представляет собой список элементов String, содержащих данные, найденные путем удаления разделителей. Первая возвращенная строка содержит имена столбцов, которые обрабатываются особым образом.
Чтение файлов CSV в словарь с помощью csv
Вместо того, чтобы иметь дело со списком отдельных элементов String, вы также можете считывать данные CSV непосредственно в словарь (технически это упорядоченный словарь).
И снова наш входной файл employee_birthday.txt выглядит следующим образом:
Вот код, чтобы на этот раз прочитать его как словарь:
Откуда взялись ключи словаря? Предполагается, что первая строка CSV-файла содержит ключи, используемые для построения словаря. Если в вашем файле CSV их нет, вы должны указать свои собственные ключи, установив необязательный параметр fieldnames в список, содержащий их.
Необязательные параметры чтения Python CSV
Объект чтения может обрабатывать различные стили CSV-файлов, указав дополнительные параметры, некоторые из которых показаны ниже:
разделитель указывает символ, используемый для разделения каждого поля. По умолчанию используется запятая ( ',' ).
quotechar указывает символ, используемый для окружения полей, содержащих символ-разделитель. По умолчанию используется двойная кавычка ( ' " ' ).
escapechar указывает символ, используемый для экранирования символа-разделителя, если кавычки не используются. По умолчанию escape-символ отсутствует.
Эти параметры заслуживают дополнительного пояснения. Предположим, вы работаете со следующим файлом employee_addresses.txt:
Этот CSV-файл содержит три поля: имя , адрес и дату присоединения , разделенные запятыми. Проблема в том, что данные для поля адреса также содержат запятую для обозначения почтового индекса.
Есть три разных способа справиться с этой ситуацией:
Используйте другой разделитель.
Таким образом, запятую можно безопасно использовать в самих данных. Вы используете необязательный параметр delimiter, чтобы указать новый разделитель.
Заключите данные в кавычки.
Специальная природа выбранного вами разделителя игнорируется в строках в кавычках.Таким образом, вы можете указать символ, используемый для цитирования, с помощью необязательного параметра quotechar. Пока этот символ не появляется в данных, все в порядке.
Эскейп-символы-разделители в данных
Эскейп-символы работают так же, как и в строках формата, сводя на нет интерпретацию экранируемого символа (в данном случае разделителя). Если используется escape-символ, его необходимо указать с помощью дополнительного параметра escapechar.
Запись файлов CSV с помощью csv
Вы также можете писать в CSV-файл, используя объект записи и метод .write_row():
Необязательный параметр quotechar сообщает средству записи, какой символ использовать для кавычек полей при записи. Однако использование цитирования определяется необязательным параметром quoting:
- Если для цитирования задано значение csv.QUOTE_MINIMAL , то .writerow() будет заключать в кавычки поля только в том случае, если они содержат разделитель или кавычку . Это случай по умолчанию.
- Если для цитирования задано значение csv.QUOTE_ALL , то .writerow() будет цитировать все поля.
- Если для цитирования задано значение csv.QUOTE_NONNUMERIC , то .writerow() будет заключать в кавычки все поля, содержащие текстовые данные, и преобразовывать все числовые поля в тип данных с плавающей запятой.
- Если для цитирования задано значение csv.QUOTE_NONE , то .writerow() будет экранировать разделители, а не заключать их в кавычки. В этом случае вы также должны указать значение для дополнительного параметра escapechar.
Чтение файла в виде обычного текста показывает, что файл создается следующим образом:
Запись файла CSV из словаря с помощью csv
Поскольку вы можете считывать наши данные в словарь, будет справедливо, если вы сможете и записать их из словаря:
В отличие от DictReader, параметр fieldnames требуется при записи словаря. Это имеет смысл, если подумать: без списка имен полей DictWriter не может знать, какие ключи использовать для извлечения значений из ваших словарей. Он также использует ключи в именах полей для записи первой строки в виде имен столбцов.
Приведенный выше код создает следующий выходной файл:
Анализ CSV-файлов с помощью библиотеки pandas
Конечно, библиотека Python CSV — не единственная игра в городе. Чтение CSV-файлов возможно и в пандах. Настоятельно рекомендуется, если у вас есть много данных для анализа.
pandas – это библиотека Python с открытым исходным кодом, которая предоставляет высокопроизводительные инструменты анализа данных и простые в использовании структуры данных. pandas доступен для всех установок Python, но он является ключевой частью дистрибутива Anaconda и очень хорошо работает в блокнотах Jupyter для обмена данными, кодом, результатами анализа, визуализациями и повествовательным текстом.
Установить pandas и его зависимости в Anaconda очень просто:
Как и использование pip / pipenv для других установок Python:
Мы не будем вдаваться в подробности того, как работают панды или как их использовать. Для более подробного ознакомления с использованием панд для чтения и анализа больших наборов данных ознакомьтесь с превосходной статьей Шантну Тивари о работе с большими файлами Excel в пандах.
Чтение CSV-файлов с помощью pandas
Чтобы продемонстрировать некоторые возможности Pandas CSV, я создал немного более сложный для чтения файл, который называется hrdata.csv . Содержит данные о сотрудниках компании:
Чтение CSV в кадр данных pandas выполняется быстро и просто:
Вот и все: три строки кода, и только одна из них выполняет реальную работу. pandas.read_csv() открывает, анализирует и читает предоставленный CSV-файл и сохраняет данные в DataFrame. Печать DataFrame приводит к следующему выводу:
Вот несколько моментов, на которые стоит обратить внимание:
- Во-первых, pandas распознали, что первая строка CSV-файла содержит имена столбцов, и использовали их автоматически. Я называю это Добротой.
- Однако pandas также использует целочисленные индексы с отсчетом от нуля в DataFrame . Это потому, что мы не сказали ему, каким должен быть наш индекс.
Кроме того, если вы посмотрите на типы данных наших столбцов, вы увидите, что pandas правильно преобразовал оставшиеся столбцы Salary и Sick Days в числа, но столбец Hire Date по-прежнему является строкой. В этом легко убедиться в интерактивном режиме:
Давайте рассмотрим эти проблемы по очереди. Чтобы использовать другой столбец в качестве индекса DataFrame, добавьте необязательный параметр index_col:
Теперь поле Name является нашим индексом DataFrame:
Далее исправим тип данных поля «Дата приема на работу». Вы можете заставить pandas читать данные как дату с помощью дополнительного параметра parse_dates, который определяется как список имен столбцов, которые следует рассматривать как даты:
Обратите внимание на разницу в выводе:
Теперь дата имеет правильный формат, что легко проверить в интерактивном режиме:
Если в ваших CSV-файлах нет названий столбцов в первой строке, вы можете использовать необязательный параметр names, чтобы предоставить список имен столбцов. Вы также можете использовать это, если хотите переопределить имена столбцов, указанные в первой строке.В этом случае вы также должны указать pandas.read_csv() игнорировать существующие имена столбцов, используя необязательный параметр header=0:
Обратите внимание, что, поскольку имена столбцов изменились, столбцы, указанные в необязательных параметрах index_col и parse_dates, также должны быть изменены. Теперь это приводит к следующему результату:
Запись CSV-файлов с помощью pandas
Конечно, если вы не можете снова получить свои данные из панд, это не принесет вам много пользы. Записать DataFrame в CSV-файл так же просто, как и прочитать его. Давайте запишем данные с новыми именами столбцов в новый CSV-файл:
Единственное различие между этим кодом и приведенным выше кодом чтения заключается в том, что вызов print(df) был заменен вызовом df.to_csv() , предоставляющим имя файла. Новый CSV-файл выглядит следующим образом:
Заключение
Если вы понимаете основы чтения CSV-файлов, вам никогда не придется столкнуться с проблемой импорта данных. С большинством задач чтения, обработки и записи CSV можно легко справиться с помощью базовой библиотеки csv Python. Если у вас есть много данных для чтения и обработки, библиотека pandas также предоставляет возможности быстрой и простой обработки CSV.
Пройдите тест: проверьте свои знания с помощью нашей интерактивной викторины «Чтение и запись файлов CSV в Python». По завершении вы получите балл, чтобы вы могли отслеживать свой прогресс в обучении с течением времени:
Есть ли другие способы анализа текстовых файлов? Конечно! Библиотеки, такие как ANTLR, PLY и PlyPlus, могут справляться с тяжелым синтаксическим анализом, и если простые манипуляции со строками не сработают, всегда есть регулярные выражения.
Но это темы для других статей…
Бесплатная загрузка: получите образец главы из книги Основы Python: практическое введение в Python 3, чтобы узнать, как перейти от начального к среднему уровню владения Python с помощью полной учебной программы, актуальной для Python 3.8.
Смотреть сейчас Это руководство содержит связанный с ним видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным учебным пособием, чтобы углубить свое понимание: Чтение и запись файлов CSV
Раз в несколько дней получайте короткие и интересные трюки с Python. Никакого спама никогда. Отписаться в любое время. Куратор: команда Real Python.
О Джоне Финчере
Джон преподавал Python и Java в двух средних школах штата Вашингтон. Ранее он был руководителем программы в Microsoft.
В этой статье объясняется, как загружать и анализировать файл CSV в Python.
Во-первых, что такое CSV?
CSV (значения, разделенные запятыми) – это простой формат файлов, используемый для хранения табличных данных, таких как электронные таблицы или базы данных. В файле CSV табличные данные (числа и текст) хранятся в виде обычного текста. Каждая строка файла представляет собой запись данных. Каждая запись состоит из одного или нескольких полей, разделенных запятыми. Использование запятой в качестве разделителя полей является источником названия для этого формата файла.
Для работы с CSV-файлами в Python существует встроенный модуль csv.
Чтение файла CSV
Питон
Вывод вышеуказанной программы выглядит следующим образом:
- Здесь мы сначала открываем файл CSV в режиме ЧТЕНИЯ. Файловый объект называется csvfile. Файловый объект преобразуется в объект csv.reader. Мы сохраняем объект csv.reader как csvreader.
- csvreader — это итерируемый объект. Следовательно, метод .next() возвращает текущую строку и переводит итератор на следующую строку. Поскольку первая строка нашего CSV-файла содержит заголовки (или имена полей), мы сохраняем их в списке с именем fields.
- Теперь мы перебираем оставшиеся строки, используя цикл for. Каждая строка добавляется в список, называемый строками. Если вы попытаетесь напечатать каждую строку, можно обнаружить, что строка — это не что иное, как список, содержащий все значения поля.
- csvreader.line_num — это не что иное, как счетчик, который возвращает количество итерированных строк.
Запись в файл CSV
Питон
- поля и строки уже определены. fields — это список, содержащий имена всех полей. rows — это список списков. Каждая строка представляет собой список, содержащий значения полей этой строки.
- Здесь мы сначала открываем файл CSV в режиме записи. Файловый объект называется csvfile. Файловый объект преобразуется в объект csv.writer. Мы сохраняем объект csv.writer как csvwriter.