read_csv в Pandas — полный гайд по загрузке данных
Коротко
pd.read_csv() — главная функция для загрузки табличных данных в pandas. На собеседованиях аналитиков спрашивают про параметры encoding, sep, parse_dates, dtype — и ожидают, что вы знаете, как справляться с кракозябрами, неправильными датами и гигабайтными файлами.
Базовая загрузка
import pandas as pd
df = pd.read_csv('data.csv')
df.head()По умолчанию pandas ожидает запятую как разделитель, UTF-8 кодировку и первую строку как заголовок. Если файл другой — нужны параметры.
Ключевые параметры
sep / delimiter — разделитель
# Точка с запятой — типично для русских CSV из Excel
df = pd.read_csv('data.csv', sep=';')
# Табуляция
df = pd.read_csv('data.tsv', sep='\t')encoding — кодировка
# UTF-8 — по умолчанию, явно указывать не нужно
df = pd.read_csv('data.csv', encoding='utf-8')
# cp1251 — Windows-кодировка, частая в русскоязычных файлах
df = pd.read_csv('report.csv', encoding='cp1251')Если видите � или РџСЂРёРІРμС‚ — почти наверняка файл в cp1251, а pandas читает как UTF-8.
header и names — заголовки
# Файл без заголовка
df = pd.read_csv('data.csv', header=None)
# Свои названия столбцов
df = pd.read_csv('data.csv', header=None, names=['date', 'user_id', 'revenue'])index_col — столбец-индекс
# Первый столбец как индекс
df = pd.read_csv('data.csv', index_col=0)
# По имени
df = pd.read_csv('data.csv', index_col='user_id')Парсинг дат — parse_dates
По умолчанию pandas загружает даты как строки. Чтобы получить datetime, передайте parse_dates:
df = pd.read_csv('events.csv', parse_dates=['event_date'])
# Несколько столбцов
df = pd.read_csv('orders.csv', parse_dates=['order_date', 'ship_date'])Если формат нестандартный, parse_dates не справится — даты останутся строками без ошибки. Тогда парсите вручную:
df = pd.read_csv('data.csv')
df['date'] = pd.to_datetime(df['date'], format='%d.%m.%Y')Русские выгрузки часто содержат даты в формате 01.03.2025 — parse_dates может перепутать день и месяц. Указывайте dayfirst=True или парсите через pd.to_datetime с явным format.
dtype — типы данных
df = pd.read_csv('users.csv', dtype={
'user_id': str, # ID как строку, не число
'age': 'Int64', # nullable integer
'is_premium': bool
})Зачем? Столбец user_id = 00123 без dtype=str превратится в 123. А столбцы с пропусками нельзя хранить как int — нужен Int64 (с большой буквы, nullable).
Выборочная загрузка
usecols — только нужные столбцы
# По именам
df = pd.read_csv('big_table.csv', usecols=['user_id', 'event', 'revenue'])
# По индексам
df = pd.read_csv('big_table.csv', usecols=[0, 3, 5])nrows и skiprows — ограничение строк
# Первые 1000 строк — быстрая разведка
df = pd.read_csv('huge_file.csv', nrows=1000)
# Пропустить первые 5 строк (например, мусорные комментарии)
df = pd.read_csv('report.csv', skiprows=5)Комбинация usecols + nrows — лучший способ быстро заглянуть в файл на 10 ГБ, не загружая его целиком.
Пропуски — na_values
df = pd.read_csv('data.csv', na_values=['N/A', '-', 'н/д', ''])pandas автоматически распознаёт NaN, NA, пустые строки как пропуски. Но н/д, —, null в нижнем регистре — нет. Если в данных свои маркеры пропусков, передавайте их явно. Подробнее о работе с пропусками — в гайде по пропускам.
Загрузка из URL
url = 'https://raw.githubusercontent.com/datasets/covid-19/main/data/countries-aggregated.csv'
df = pd.read_csv(url)Работает с любым URL, который возвращает CSV. Удобно для публичных датасетов и API.
read_excel — коротко
df = pd.read_excel('report.xlsx', sheet_name='Sheet1')
# Конкретный диапазон столбцов
df = pd.read_excel('report.xlsx', usecols='A:D', skiprows=2)Параметры dtype, parse_dates, na_values, usecols работают так же, как в read_csv. Нужна библиотека openpyxl (для xlsx) или xlrd (для xls).
Практические примеры
Русский CSV из 1С / Excel
df = pd.read_csv(
'выгрузка_1с.csv',
sep=';',
encoding='cp1251',
dtype={'ИНН': str},
parse_dates=['Дата'],
dayfirst=True,
na_values=['', '-', 'н/д']
)Быстрый просмотр большого файла
# Смотрим структуру и типы
preview = pd.read_csv('logs_10gb.csv', nrows=100)
print(preview.dtypes)
print(preview.describe())Даты, которые парсятся неправильно
# 01.02.2025 — это 1 февраля или 2 января?
df = pd.read_csv('data.csv')
df['date'] = pd.to_datetime(df['date'], format='%d.%m.%Y') # явный формат — надёжноЧастые ошибки
Кракозябры вместо русского текста. Файл в cp1251, pandas читает как UTF-8. Решение: encoding='cp1251'. Если не знаете кодировку — попробуйте encoding='cp1251', потом encoding='latin1'.
Даты остались строками. Забыли parse_dates или формат нестандартный. Проверяйте df.dtypes — если видите object вместо datetime64, даты не распарсились.
ID потерял ведущие нули. user_id = 00123 стал 123. Решение: dtype={'user_id': str}.
MemoryError на большом файле. Используйте usecols + dtype для экономии памяти, nrows для разведки, или chunksize для чтения по частям:
for chunk in pd.read_csv('huge.csv', chunksize=100_000):
process(chunk)Вопросы с собеседований
— Как загрузить CSV с кодировкой cp1251 и разделителем «;»?
— pd.read_csv('file.csv', sep=';', encoding='cp1251'). Типичная ситуация для русскоязычных выгрузок из Excel и 1С.
— Что делать, если parse_dates не парсит даты?
— Скорее всего, формат нестандартный. Используйте pd.to_datetime(df['col'], format='%d.%m.%Y') с явным указанием формата. parse_dates работает надёжно только с ISO-форматами.
— Как загрузить первые N строк CSV?
— pd.read_csv('file.csv', nrows=N). Полезно для разведки больших файлов, чтобы понять структуру и типы данных до полной загрузки.
— Чем отличаются dtype='str' и dtype='object' в read_csv?
— На практике оба сохраняют значения как строки. str — более явный и читаемый. object — внутренний тип pandas для строк. С pandas 2.0 можно использовать dtype='string' для StringDtype с поддержкой NA.
— Как прочитать CSV по частям, если он не помещается в память?
— Передать chunksize=N — read_csv вернёт итератор, который отдаёт DataFrame по N строк. Каждый чанк обрабатывается отдельно, результаты агрегируются.
Потренировать Python-вопросы на практике можно в тренажёре Карьерника. Ещё больше примеров — на странице с вопросами.
Открыть тренажёр в Telegram — вопросы по pandas, SQL и аналитике. Бесплатно.
FAQ
Как определить кодировку CSV-файла?
Попробуйте encoding='utf-8' (по умолчанию), затем 'cp1251'. Если не помогает — используйте библиотеку chardet: chardet.detect(open('file.csv', 'rb').read()) покажет вероятную кодировку. Для русских файлов из Windows в 90% случаев это cp1251.
Можно ли читать CSV из архива?
Да. pd.read_csv('data.csv.gz', compression='gzip') — pandas умеет распаковывать gzip, bz2, zip и xz прямо при чтении. Для zip-архива с несколькими файлами передайте compression={'method': 'zip', 'archive_name': 'data.csv'}.
Чем read_csv лучше read_excel?
read_csv быстрее в 5-50 раз, потому что CSV — текст, а Excel — бинарный формат со стилями, формулами и листами. Если есть выбор — экспортируйте данные в CSV. read_excel удобен, когда файл приходит от бизнеса в xlsx и конвертировать нет возможности.
Как загрузить CSV с несколькими типами разделителей?
Используйте sep=None с engine='python' — pandas попробует определить разделитель автоматически. Но это медленнее стандартного C-движка. Если знаете разделитель — всегда указывайте явно. Больше приёмов работы с данными — в шпаргалке по pandas.