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.