Практическое руководство по чтению CSV-файлов в Python
Введение в чтение CSV в Python
CSV (Comma-Separated Values) - один из самых распространенных форматов для хранения табличных данных. В Python существует несколько подходов для его чтения. Ниже рассматриваются основные варианты с примерами и указанием типичных проблем.
Какое решение обеспечивает максимальную производительность и удобство при работе с CSV?
Наиболее эффективным считается использование библиотеки pandas. Она автоматически обрабатывает заголовки, типы данных и предоставляет гибкие возможности фильтрации.
import pandas as pd
df = pd.read_csv('data.csv')
print(df.head())чтение csv python (чтение csv в python)
Пояснение: функция pd.read_csv читает файл и возвращает объект DataFrame. Параметр sep (по умолчанию ',') позволяет задать разделитель. Для больших файлов рекомендуется указывать chunksize или iterator.
Типичная ошибка: UnicodeDecodeError при неверной кодировке. Решение: указать параметр encoding, например encoding='utf-8' или encoding='cp1251'.
Если файл содержит строки с кавычками, pandas обрабатывает их автоматически, но при нестандартном формате может потребоваться параметр quoting.
Как прочитать CSV без установки дополнительных библиотек?
Стандартный модуль csv входит в состав Python и не требует установки.
import csv
with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)Пояснение: объект csv.reader возвращает итератор строк, каждая строка - список значений. Альтернатива - csv.DictReader, который использует первую строку как заголовки.
import csv
with open('data.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
print(row['Name'], row['Age'])Ошибка: если в файле есть пустые строки, reader может пропустить их или вернуть пустой список. Рекомендуется проверять row на пустоту.
Проблема с разделителем: если разделитель не запятая (например, точка с запятой), укажите delimiter=';'.
Как загрузить CSV в массив NumPy?
Библиотека NumPy предоставляет функции loadtxt и genfromtxt для числовых данных.
import numpy as np
data = np.loadtxt('data.csv', delimiter=',', skiprows=1)
print(data.shape)Пояснение: skiprows пропускает заголовок. genfromtxt умеет обрабатывать пропущенные значения через параметр missing_values.
Ошибка: если файл содержит строки или смешанные типы, loadtxt вызовет исключение. В таких случаях используйте genfromtxt с dtype=None.
Как обработать CSV вручную, используя только встроенные функции open и split?
Этот подход полезен для учебных целей или когда файл имеет очень простую структуру.
with open('data.csv', 'r') as f:
header = f.readline().strip().split(',')
for line in f:
row = line.strip().split(',')
print(dict(zip(header, row)))Пояснение: первая строка обрабатывается как заголовок, последующие строки преобразуются в словари. Недостаток - нет обработки кавычек и экранирования.
Проблема: split ошибочно разделит значения, содержащие запятые внутри кавычек. Для таких файлов этот метод неприменим.
Расширенные примеры чтения CSV в Python
Ниже приведены более сложные сценарии, включающие обработку больших файлов, нестандартные разделители и пропущенные значения.
Чтение большого CSV по частям (chunks)
import pandas as pd
chunk_iter = pd.read_csv('large_data.csv', chunksize=1000)
for chunk in chunk_iter:
print(chunk.shape)
# обработка очередного фрагментаРезультат: (1000, 10), (1000, 10), …
Пояснение: параметр chunksize превращает read_csv в итератор, позволяя обрабатывать данные частями, не загружая весь файл в память.
Использование пользовательских разделителей и кавычек
import pandas as pd
df = pd.read_csv('data.tsv', sep='\t', quotechar='"',
doublequote=True, encoding='utf-8')
print(df.head())Пояснение: sep='\t' для TSV, quotechar задаёт символ кавычки, doublequote обрабатывает удвоенные кавычки внутри поля.
Обработка пропущенных значений и дополнительных пробелов
import pandas as pd
df = pd.read_csv('messy.csv', na_values=['NA', 'N/A', ''],
skipinitialspace=True)
print(df.isnull().sum())Результат: столбец Age: 3 пропуска, столбец Name: 0
Пояснение: na_values указывает, какие строки считать NaN, skipinitialspace удаляет пробелы после разделителя.
Выборочное чтение столбцов и строк
import pandas as pd
df = pd.read_csv('data.csv', usecols=['Name', 'Age'],
skiprows=[1,3,5], nrows=100)
print(df.head())Пояснение: usecols загружает только указанные столбцы, skiprows пропускает строки по индексам, nrows ограничивает количество читаемых строк.
Чтение CSV с несколькими заголовками
import pandas as pd
df = pd.read_csv('multi_header.csv', header=[0,1])
print(df.columns)Результат: MultiIndex([('Year', 'Sales'), ('Year', 'Profit')], …)Пояснение: header=[0,1] использует первые две строки как многоуровневый заголовок.
Ручное чтение с обработкой кавычек (модуль csv)
import csv
with open('complex.csv', 'r') as f:
reader = csv.reader(f, delimiter=',', quotechar='"',
quoting=csv.QUOTE_MINIMAL)
for row in reader:
print(row)Пояснение: параметр quoting определяет, как обрабатывать поля с кавычками. QUOTE_MINIMAL экранирует только при необходимости.
Использование numpy.genfromtxt для смешанных типов
import numpy as np
data = np.genfromtxt('mixed.csv', delimiter=',', dtype=None,
names=True, encoding='utf-8')
print(data.dtype)Результат: [('Name', 'Пояснение: dtype=None позволяет автоматически определять типы каждого столбца, names=True использует первую строку как имена полей.