Чтение файлов в Python на собеседовании
Почему чтение файлов спрашивают на собеседовании
Аналитик каждый день загружает данные из CSV, Excel и JSON. Кажется, что read_csv — это тривиально. Но на собеседовании вопросы по чтению файлов проверяют глубину: что делать с кодировкой, как прочитать файл на 10 ГБ, как обработать битые строки, как оптимизировать типы данных при загрузке.
Типичный формат: интервьюер описывает проблему с данными и просит решить через параметры read_csv. Или даёт файл с ошибками и спрашивает, почему загрузка падает.
Умение правильно загрузить данные — первый шаг любого анализа. Если вы не справляетесь с read_csv на собеседовании, до анализа дело не дойдёт.
pd.read_csv: ключевые параметры
Базовый вызов: pd.read_csv('data.csv') — работает для идеальных файлов. В реальности данные редко идеальны, поэтому нужны параметры.
sep / delimiter — разделитель полей. По умолчанию запятая. Для TSV: sep='\t'. Для файлов с точкой с запятой (частый формат в Excel для русской локали): sep=';'.
encoding — кодировка файла. encoding='utf-8' по умолчанию. Для файлов из 1С и старых Windows-систем: encoding='cp1251'. Если не знаете кодировку — encoding='utf-8-sig' обрабатывает BOM-маркер. На собеседовании знание cp1251 показывает опыт работы с российскими данными.
dtype — явное указание типов. dtype={'user_id': str} — если ID начинается с нуля (например, '007'), без этого pandas прочитает его как число 7. Это классическая ловушка.
parse_dates — конвертация колонок в datetime при загрузке. parse_dates=['created_at'] быстрее, чем pd.to_datetime после загрузки.
na_values — дополнительные значения для пропусков. По умолчанию pandas распознаёт '', 'NA', 'null'. Но данные из внешних систем могут использовать '-', 'N/A', 'нет данных'.
Большие файлы: chunksize и оптимизация
chunksize — чтение файла порциями. pd.read_csv('big.csv', chunksize=100000) возвращает итератор, каждая итерация — DataFrame на 100 000 строк. Обработка по частям экономит память.
usecols — чтение только нужных колонок. Если в файле 50 колонок, а для анализа нужны 5 — usecols=['col1', 'col2', 'col3', 'col4', 'col5'] ускорит загрузку и снизит потребление памяти.
dtype для оптимизации памяти — dtype={'category_col': 'category', 'flag': 'int8'}. Категориальный тип для строк с малым числом уникальных значений, int8 вместо int64 для маленьких чисел. На миллионах строк это снижает память в разы.
nrows — чтение первых N строк. nrows=1000 для предварительного просмотра структуры данных. Полезно при работе с незнакомым файлом.
read_excel и JSON
pd.read_excel — чтение Excel-файлов. Параметры sheet_name (имя или номер листа), header (строка с заголовками), skiprows (пропустить строки сверху). Для чтения всех листов: sheet_name=None — возвращает словарь DataFrame.
Важно: read_excel значительно медленнее read_csv. Если данные большие — попросите выгрузку в CSV. На собеседовании это показывает практический опыт.
pd.read_json — чтение JSON. Параметр orient определяет структуру: 'records' для списка словарей, 'columns' для словаря списков. Для вложенного JSON — json_normalize из pandas или стандартный json.loads с последующей обработкой.
Стандартный json: import json; data = json.load(open('file.json')) — для нестандартных структур, которые read_json не обрабатывает. Затем ручная конвертация в DataFrame.
Совет: на собеседовании не просто называйте функцию — опишите, какие параметры вы укажете. «read_csv с sep точка-с-запятой, encoding cp1251 и parse_dates для колонки с датой» — это показывает реальный опыт.
Типичные проблемы и решения
- UnicodeDecodeError — неправильная кодировка. Попробуйте cp1251, latin1, utf-8-sig. Библиотека chardet может определить кодировку автоматически.
- ParserError: Expected N fields, saw M — строки с разным количеством разделителей. Параметр
error_bad_lines=False(pandas < 2.0) илиon_bad_lines='skip'пропустит битые строки. - Числа с запятой как десятичным разделителем —
decimal=','в read_csv. Без этого '3,14' будет строкой, а не числом. - Пустые строки в начале файла —
skiprows=Nилиheader=Nдля указания строки с заголовками.
FAQ
Как прочитать файл на 10 ГБ в pandas?
Три подхода: chunksize для построчной обработки, usecols + dtype для снижения памяти, или переход на Dask / Polars для ленивых вычислений. На собеседовании достаточно знать chunksize и объяснить принцип: обрабатывать порциями, агрегировать результаты, не загружать всё в память.
Что лучше: read_csv или read_excel?
read_csv быстрее в 5-10 раз и надёжнее. Excel добавляет форматирование, объединённые ячейки, формулы — всё это усложняет парсинг. Если есть выбор — выгружайте данные в CSV. На собеседовании это правильный ответ.
Как прочитать файл с несколькими заголовками?
Используйте header=[0, 1] для мультииндекса в колонках. Для пропуска строк перед заголовком — skiprows. Если структура нестандартная — прочитайте без заголовков (header=None) и обработайте вручную. Больше тем — в разделе Python и подготовка.