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

Python解析API返回字典时如何处理多个缺失键避免KeyError

解决方案

核心思路

编写通用的嵌套结构安全取值工具函数,自动处理取值路径中任意一层的KeyError(字典缺键)、IndexError(列表索引越界)、TypeError(对象不可索引)问题,只要任意一层不存在就直接返回预设的默认值"none",无需为每个字段单独编写try-except块。

具体实现

1. 定义安全取值函数

def safe_get(obj, *path, default="none"):
    current = obj
    for key in path:
        try:
            current = current[key]
        except (KeyError, IndexError, TypeError):
            return default
    return current

函数使用规则:若需要取值x['contacts'][0]['phone'][0]['value'],只需按路径顺序传入参数即可:safe_get(x, 'contacts', 0, 'phone', 0, 'value')。

2. 替换原有取值逻辑

原有代码仅对网站字段做了异常捕获,电话字段完全没有做缺失处理,是触发报错的核心原因。将所有可能存在缺失的字段都用上述safe_get函数包裹即可。

3. 修改后的完整代码

import requests
import geocoder
import pprint

# 定义安全取值工具函数
def safe_get(obj, *path, default="none"):
    current = obj
    for key in path:
        try:
            current = current[key]
        except (KeyError, IndexError, TypeError):
            return default
    return current

g = geocoder.ip('me')
print(g.latlng)
latitude, longitude = g.latlng
URL = "https://discover.search.hereapi.com/v1/discover"
# 此处替换为实际坐标值
latitude = xxxx
longitude = xxxx
api_key = 'xxxxx' # 从developer.here.com获取
query = 'food'
limit = 12

PARAMS = {
            'apikey':api_key,
            'q':query,
            'limit': limit,
            'at':'{},{}'.format(latitude,longitude)
         }

# 发送请求获取返回数据
r = requests.get(url = URL, params = PARAMS)
data = r.json()


for x in data['items']:
    title = safe_get(x, 'title')
    address = safe_get(x, 'address', 'label')
    street = safe_get(x, 'address', 'street')
    postalCode = safe_get(x, 'address', 'postalCode')
    position = safe_get(x, 'position')
    access = safe_get(x, 'access')
    typeOfBusiness = safe_get(x, 'categories', 0, 'name')
    # 电话字段缺失处理
    contacts = safe_get(x, 'contacts', 0, 'phone', 0, 'value')
    # 网站字段缺失处理
    website = safe_get(x, 'contacts', 0, 'www', 0, 'value')

    resultList = {
    'BUSINESS NAME:':title,
    'ADDRESS:':address,
    'STREET NAME:':street,
    'POSTCODE:':postalCode,
    'POSITION:':position,
    'POSITSION2:':access,
    'TYPE:':typeOfBusiness,
    'PHONE:':contacts,
    'WEBSITE:':website
    }

    print("--"*80)
    pprint.pprint(resultList)

补充说明

  • 若需要将默认值改为Python原生的None,只需修改safe_get函数的default参数即可
  • 后续新增提取字段时,只需按取值路径传参给safe_get即可,无需新增异常捕获逻辑
  • 该方案覆盖了API返回的绝大多数异常场景:字典缺键、列表为空/索引越界、中间节点返回None等情况都能正常处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:54:02