Как прочитать CSV-файл в Python
В этом уроке вы узнаете, как прочитать файл CSV на Python с помощью встроенного модуля csv.
- Что такое CSV-файл?
- Чтение файла csv в Python
- Пример чтения файлов CSV в Python
- Чтение CSV-файла с помощью класса DictReader
Что такое CSV-файл?
CSV (comma-separated values) — значения, разделенные запятыми. Файл CSV представляет собой текстовый файл с разделителями, в котором для разделения значений используется запятая.
Файл CSV состоит из одной или нескольких строк. Каждая строка представляет собой запись данных. Каждая запись данных состоит из одного или нескольких значений, разделенных запятыми. Кроме того, все строки файла CSV имеют одинаковое количество значений.
Обычно вы используете файл CSV для хранения табличных данных в виде обычного текста. Формат файла CSV довольно популярен и поддерживается многими программными приложениями, такими как Microsoft Excel и Google Spreadsheet.
Чтение файла csv в Python
Чтобы прочитать файл CSV в Python, выполните следующие действия:
- Сначала импортируйте модуль csv:
import csv
- Во-вторых, откройте файл CSV с помощью встроенной функции open() в режиме чтения:
f = open('path/to/csv_file')
Если CSV содержит символы UTF8, вам необходимо указать следующую кодировку:
f = open('path/to/csv_file', encoding='UTF8')
- В-третьих, передайте файловый объект(f) в функцию read() модуля csv. Функция read() возвращает объект чтения csv:
csv_reader = csv.reader(f)
csv_reader — это повторяемый объект строк из файла CSV. Таким образом, вы можете перебирать строки CSV-файла, используя цикл for:
for line in csv_reader: print(line)
Каждая строка представляет собой список значений. Для доступа к каждому значению вы используете квадратную скобку []. Первое значение имеет индекс 0. Второе значение имеет индекс 1 и так далее.
Например, следующая команда обращается к первому значению определенной строки:
line[0]
- Наконец, всегда закрывайте файл, когда у вас больше нет доступа к нему, вызывая метод close() файлового объекта:
f.close()
Будет проще использовать оператор with, так что вам не придется явно вызывать метод close().
Ниже показаны все этапы чтения файла CSV:
import csv with open('path/to/csv_file', 'r') as f: csv_reader = csv.reader(f) for line in csv_reader: # process each line print(line)
Пример чтения файлов CSV в Python
Мы будем использовать файл Country.csv, который содержит информацию о стране, включая имя, регион, двухбуквенный код страны, трехбуквенный код страны:
Ниже показано, как читать файл Country.csv и отображать каждую строку на экране:
import csv with open('country.csv', encoding="utf8") as f: csv_reader = csv.reader(f) for line in csv_reader: print(line)
Выход:
['name', 'area', 'country_code2', 'country_code3'] ['Afghanistan', '652090.00', 'AF', 'AFG'] ['Albania', '28748.00', 'AL', 'ALB'] ['Algeria', '2381741.00', 'DZ', 'DZA'] ['American Samoa', '199.00', 'AS', 'ASM'] ...
В файле Country.csv первая строка является заголовком. Чтобы разделить заголовок и данные, используйте функцию enumerate(), чтобы получить индекс каждой строки:
import csv with open('country.csv', encoding="utf8") as f: csv_reader = csv.reader(f) for line_no, line in enumerate(csv_reader, 1): if line_no == 1: print('Header:') print(line) # header print('Data:') else: print(line) # data
В этом примере мы используем функцию enumerate() и указываем индекс первой строки как 1. Внутри цикла, если line_no равен 1, строка является заголовком. В противном случае это линия данных.
Другой способ пропустить заголовок — использовать функцию next(). Функция next() пересылает читателя на следующую строку. Например:
import csv with open('country.csv', encoding="utf8") as f: csv_reader = csv.reader(f) # skip the first row next(csv_reader) # show the data for line in csv_reader: print(line)
Ниже считывается файл Country.csv и вычисляются общие площади всех стран:
import csv total_area = 0 # calculate the total area of all countries with open('country.csv', encoding="utf8") as f: csv_reader = csv.reader(f) # skip the header next(csv_reader) # calculate total for line in csv_reader: total_area += float(line[1]) print(total_area)
Выход:
148956306.9
Чтение CSV-файла с помощью класса DictReader
Когда вы используете функцию csv.reader(), вы можете получить доступ к значениям файла CSV, используя скобочные обозначения, такие как line[0], line[1] и т. д. Однако использование функции csv.reader() имеет два основных ограничения:
- Во-первых, способ доступа к значениям из файла CSV не так очевиден. Например, line[0] неявно означает название страны. Было бы более выразительно, если бы вы могли получить доступ к названию страны, например, line[‘country_name’].
- Во-вторых, когда порядок столбцов в CSV-файле изменяется или добавляются новые столбцы, вам необходимо изменить код, чтобы получить правильные данные.
Здесь в игру вступает класс DictReader. Класс DictReader также происходит из модуля csv.
Класс DictReader позволяет создать объект, подобный обычному средству чтения CSV. Но он отображает информацию каждой строки в словарь(dict), ключи которого определяются значениями первой строки.
Используя класс DictReader, вы можете получить доступ к значениям в файле Country.csv, например line[‘name’], line[‘area’], line[‘country_code2’] и line[‘country_code3’].
В следующем примере класс DictReader используется для чтения файла Country.csv:
import csv with open('country.csv', encoding="utf8") as f: csv_reader = csv.DictReader(f) # skip the header next(csv_reader) # show the data for line in csv_reader: print(f"The area of {line['name']} is {line['area']} km2")
Выход:
The area of Afghanistan is 652090.00 km2 The area of Albania is 28748.00 km2 The area of Algeria is 2381741.00 km2 ...
Если вы хотите, чтобы имена полей отличались от тех, которые указаны в первой строке, вы можете явно указать их, передав список имен полей конструктору DictReader() следующим образом:
import csv fieldnames = ['country_name', 'area', 'code2', 'code3'] with open('country.csv', encoding="utf8") as f: csv_reader = csv.DictReader(f, fieldnames) next(csv_reader) for line in csv_reader: print(f"The area of {line['country_name']} is {line['area']} km2")
В этом примере вместо использования значений из первой строки в качестве имен полей мы явно передаем список имен полей конструктору DictReader.