写Python的小伙伴,几乎没人能躲开KeyError报错。
跑代码突然爆红终止,大概率就是这句:KeyError: 'xxx'
说白话:就是你写代码调取字典键值,用了字典里压根没有的key,程序找不到字段,直接报错罢工。
代码一运行直接爆红:KeyError: 'xxx'
本质一句话:字典/字典嵌套,调用了不存在的键key,程序找不到key,直接报错终止。
一、随手复刻报错(复制就能复现)
✅ 错误代码(直接复制运行必报错)
python # 普通字典报错 user_info = {"name":"张三","age":22} # 字典里无gender键,触发KeyError print(user_info["gender"]) |
报错结果:KeyError: 'gender'
日常最容易翻车的,还是嵌套字典报错,对接接口、解析后端JSON数据,十次报错八次都是它。
python # 接口返回嵌套字典数据 res = {"code":200,"data":{"nick":"小李"}} # data内无phone键,直接报错 print(res["data"]["phone"]) |
二、不用打断点,3步快速找出问题
Step1:看报错后缀
直接看报错末尾字符,KeyError:abc,缺的键就是abc,一目了然。
Step2:打印完整字典
最简单办法:print打印完整字典,核对文字、层级、大小写。
老生常谈坑:Python字典key严格区分大小写,Name和name完全是两个字段。
Step3:核对层级
嵌套字典别越级取值,绝大多数报错,都是层级看错了,直接跨层拿key导致的。
三、四种解决写法,按需直接抄
写法1:dict.get()|新手通用首选
key不存在不会炸代码,自定义返回默认值,零基础闭眼用。
python user_info = {"name":"张三","age":22} # 不存在返回空字符串,可自定义默认值 gender = user_info.get("gender","未知") print(gender) # 输出:未知 |
写法2:in关键字判断|需要分支逻辑用它
想要自定义存在/不存在逻辑,可控性更高,适合业务判断场景。
python user_info = {"name":"张三","age":22} if "gender" in user_info: print(user_info["gender"]) else: print("该键不存在") |
写法3:defaultdict|批量循环取值专用
遍历字典、数据统计高频场景,不用反复写if判空,提前预设字段默认值即可。
python from collections import defaultdict # 不存在key默认返回空字符串 d = defaultdict(str) d["name"] = "王五" print(d["phone"]) # 不报错,输出空值 |
写法4:try-except捕获|爬虫/接口开发必用
第三方接口字段不稳定、爬虫解析json,容错能力最强,不会单字段缺失直接宕机。
python res = {"code":200,"data":{"nick":"小李"}} try: phone = res["data"]["phone"] except KeyError: phone = None # 缺失键直接赋值为空 print(phone) |
最后整理实操避坑要点
1.生产代码尽量少用字典[key]直取,优先改用.get(),稳很多
2.对接外部接口,一定要加异常捕获,防止字段缺失导致整条程序停下
3.不要手动手打key,极易写错大小写、字符,直接复制原有字段最稳妥
4.多层嵌套字典,逐层打印核对层级,千万别偷懒越级取值
💡 收藏备用,后续碰到KeyError,直接拿文中代码套用就行。