#Что означает ошибка
KeyError: 'name'
KeyError: 'name' возникает при обращении к ключу, которого нет в словаре (d["name"]). Это самая частая ошибка при работе с JSON и данными API: структура ответа отличается от ожидаемой.
Сначала посмотрите, какие ключи есть, и проверьте регистр и тип ключа.
Затем выберите безопасный способ доступа.
KeyError возникает при обращении к ключу, которого нет в словаре. Используйте dict.get() или проверку in, чтобы обработать отсутствие ключа.
value = data.get("name", "")#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Ключа нет в словаре | В словаре действительно нет ожидаемого ключа | Используйте get только для необязательных полей; обязательные проверяйте. |
| Опечатка в ключе | Различаются регистр, пробелы или тип ключа | Сверьте repr ключей и реальную структуру входного объекта. |
| Другой регистр | API при ошибке возвращает другую структуру | Проверьте HTTP-статус до чтения ключей ответа. |
| Структура данных иная | При импорте CSV столбец называется иначе | Посмотрите df.columns, разделитель и наличие пробелов. |
#Пошаговое решение
- Выведите ключи словаряВ traceback найдите точный ключ в
KeyError: 'name', затем откройте файл Python по указанной строке. Перед проблемным чтением в локальной разработке выведитеprint(list(data.keys())), еслиdata— словарь; при вложенном JSON проверьте ключи на нужном уровне. Не выводите целиком ответы API с токенами или персональными данными. Еслиdata— не словарь, сначала проверьтеtype(data)и найдите ошибку преобразования. - Проверьте регистр, пробелы и тип ключаСверьте строку ключа в коде с реальными ключами: Python различает
nameиName, пробелы и типы1и'1'. Для данных из CSV посмотрите символы вrepr(key), для JSON проверьте структуру вложенных объектов. Не приводите все ключи к нижнему регистру, если это сломает внешние соглашения. При неверном имени исправьте его в месте чтения или преобразования входных данных. - Замените d[k] на d.get(k, default)Только если отсутствие ключа нормально, замените обязательное
data['name']наdata.get('name', '')с осмысленным значением по умолчанию. Если ключ обязан присутствовать, оставьте строгую проверку:if 'name' not in data: raise ValueError('В ответе нет поля name'). Важное различие:.get()возвращаетNone, если ключ отсутствует и второй аргумент не указан; оно не гарантирует нужный тип. Проверьте сценарии, когда ключ отсутствует, равенNoneили пустой строке. - Проверьте ответ API на ошибкиЕсли ошибка возникает при ответе API, откройте вкладку «Сеть» в браузере или журнал HTTP-клиента и проверьте код состояния, тип содержимого и структуру JSON: при ошибке сервер может возвращать
{'error': ...}вместо ожидаемого объекта. Сначала проверяйтеresponse.status_code, затем безопасно разбирайте JSON и проверяйте наличие необходимых полей. Не записывайте секретные заголовкиAuthorizationв открытый журнал. - Для 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 и выдавайте внятное сообщение об отсутствующих полях. Покройте граничные случаи тестами с неполными данными.
# Только локальная диагностика без секретовprint(list(data.keys())) # data должна быть dictprint(type(data).__name__)