Python WindowsLinux

Python: KeyError — ключ не найден в словаре

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

KeyError возникает при обращении к ключу, которого нет в словаре. Ниже — причины и порядок действий от простого к сложному.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Диагностика
  5. Безопасный доступ
  6. pandas и конфиги

#Что означает ошибка

Сообщение
KeyError: 'name'

KeyError: 'name' возникает при обращении к ключу, которого нет в словаре (d["name"]). Это самая частая ошибка при работе с JSON и данными API: структура ответа отличается от ожидаемой.

Сначала посмотрите, какие ключи есть, и проверьте регистр и тип ключа.

Затем выберите безопасный способ доступа.

KeyError возникает при обращении к ключу, которого нет в словаре. Используйте dict.get() или проверку in, чтобы обработать отсутствие ключа.

Python
Безопасное чтение значения.
value = data.get("name", "")

#Причины и решения

Возможная причинаКак узнатьЧто делать
Ключа нет в словареВ словаре действительно нет ожидаемого ключаИспользуйте get только для необязательных полей; обязательные проверяйте.
Опечатка в ключеРазличаются регистр, пробелы или тип ключаСверьте repr ключей и реальную структуру входного объекта.
Другой регистрAPI при ошибке возвращает другую структуруПроверьте HTTP-статус до чтения ключей ответа.
Структура данных инаяПри импорте CSV столбец называется иначеПосмотрите df.columns, разделитель и наличие пробелов.

#Пошаговое решение

  1. Выведите ключи словаряВ traceback найдите точный ключ в KeyError: 'name', затем откройте файл Python по указанной строке. Перед проблемным чтением в локальной разработке выведите print(list(data.keys())), если data — словарь; при вложенном JSON проверьте ключи на нужном уровне. Не выводите целиком ответы API с токенами или персональными данными. Если data — не словарь, сначала проверьте type(data) и найдите ошибку преобразования.
  2. Проверьте регистр, пробелы и тип ключаСверьте строку ключа в коде с реальными ключами: Python различает name и Name, пробелы и типы 1 и '1'. Для данных из CSV посмотрите символы в repr(key), для JSON проверьте структуру вложенных объектов. Не приводите все ключи к нижнему регистру, если это сломает внешние соглашения. При неверном имени исправьте его в месте чтения или преобразования входных данных.
  3. Замените d[k] на d.get(k, default)Только если отсутствие ключа нормально, замените обязательное data['name'] на data.get('name', '') с осмысленным значением по умолчанию. Если ключ обязан присутствовать, оставьте строгую проверку: if 'name' not in data: raise ValueError('В ответе нет поля name'). Важное различие: .get() возвращает None, если ключ отсутствует и второй аргумент не указан; оно не гарантирует нужный тип. Проверьте сценарии, когда ключ отсутствует, равен None или пустой строке.
  4. Проверьте ответ API на ошибкиЕсли ошибка возникает при ответе API, откройте вкладку «Сеть» в браузере или журнал HTTP-клиента и проверьте код состояния, тип содержимого и структуру JSON: при ошибке сервер может возвращать {'error': ...} вместо ожидаемого объекта. Сначала проверяйте response.status_code, затем безопасно разбирайте JSON и проверяйте наличие необходимых полей. Не записывайте секретные заголовки Authorization в открытый журнал.
  5. Для pandas очистите названия столбцовЕсли используется pandas и возникает KeyError: 'column', выполните print(df.columns.tolist()) и сравните настоящее имя столбца; лишние пробелы можно удалить df.columns = df.columns.str.strip() только после проверки, что очистка не создаст совпадающих названий. Убедитесь, что нужная колонка действительно загружена из CSV/Excel, а разделитель и кодировка правильные. Исправьте импорт, а затем повторите операцию без ошибки.

#Диагностика

В локальной разработке сначала выведите только названия ключей через print(list(d.keys())), не публикуя содержимое пользовательского ответа API. Проверьте регистр, пробелы, вложенность и фактический HTTP-статус; при ошибке API структура ответа часто другая.

#Безопасный доступ

Используйте d.get("name", "значение-по-умолчанию") лишь для необязательного ключа. Если обязательного поля нет, верните осмысленную ошибку валидации. Для вложенных структур сначала проверьте тип и наличие промежуточного объекта: выражение d.get("user", {}).get("name") всё равно упадёт, если user существует, но равен None.

#pandas и конфиги

В pandas KeyError на столбце чаще всего вызван пробелами или регистром в названиях: df.columns = df.columns.str.strip(), проверьте df.columns.tolist(). Для конфигураций (YAML/JSON) валидируйте структуру через pydantic или jsonschema и выдавайте внятное сообщение об отсутствующих полях. Покройте граничные случаи тестами с неполными данными.

PythonКоманда
Это фрагмент Python для вставки в локальный тестовый код, не команда оболочки. Не выводите данные пользователя целиком.
# Только локальная диагностика без секретов
print(list(data.keys())) # data должна быть dict
print(type(data).__name__)

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 1 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.