You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python处理字典缺失键:provision键不存在时取device_type值

修复字典缺失键触发KeyError的实现方法

直接在遍历设备数据时增加分支判断,不要对不确定存在的键做硬索引,即可彻底避免KeyError,同时匹配要求的取值逻辑。

核心修改逻辑

  • 遍历单条设备的data字段时,优先判断provision键是否存在
  • 键存在时,按原有规则提取provision下的endpoint_model字段值
  • 键不存在时,直接提取同层级的device_type字段值
  • 移除原代码里无意义的单层嵌套列表写法,减少不必要的循环层级,降低出错概率
  • 补充多层级的键存在校验,覆盖接口返回异常结构、字段嵌套缺失等边缘场景

修改后可直接运行的完整代码

import requests

# 保留你原有逻辑里的headers、deviceIDList变量定义即可
# headers = {}
# deviceIDList = []

# 生成所有设备的API请求地址
link = []
for device_id in deviceIDList:
    link.append(f'https://website/v2/accounts/accountid/devices/{device_id}')

# 批量拉取设备数据
deviceReq = []
for url in link:
    resp = requests.get(url, headers=headers)
    # 增加接口状态码判断,避免接口报错返回非JSON结构触发异常
    if resp.status_code == 200:
        deviceReq.append(resp.json())

# 写入结果文件
with open('masterSheet.txt', 'x', encoding='utf-8') as f:
    for item in deviceReq:
        # 先判断data字段是否存在,避免接口返回异常结构报错
        if 'data' not in item:
            continue
        device_data = item['data']
        # 分支判断取值
        if 'provision' in device_data:
            model_val = device_data['provision'].get('endpoint_model', '未知设备型号')
        else:
            model_val = device_data.get('device_type', '未知设备类型')
        # 按原有格式拼接写入
        sheet_line = f"{model_val} {device_data.get('name', '未命名设备')}"
        f.write(sheet_line + "\n")

更简洁的字典判空写法

如果偏好精简逻辑,也可以全程用字典自带的get()方法做键存在判断,get()在键不存在时不会抛错,会返回提前指定的默认值,稳定性更高:

device_data = item['data']
provision_data = device_data.get('provision')
if provision_data:
    model_val = provision_data.get('endpoint_model', '未知设备型号')
else:
    model_val = device_data.get('device_type', '未知设备类型')

这种写法可以同时覆盖provision键存在、但内部缺失endpoint_model键的边缘场景,不会触发KeyError。


内容的提问来源于stack exchange,提问作者mrOlympia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 14:39:07