Чтение файлов в Python на собеседовании

Проверь себя · 1/3разбор после ответа
Есть список булевых результатов проверок качества данных checks. Какое выражение наиболее прямо отвечает на вопрос «все проверки прошли»?

Почему чтение файлов спрашивают на собеседовании

Аналитик каждый день загружает данные из 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 и подготовка.

Смотрите также