【问题标题】:How to handle multiple missing keys in a dict?如何处理字典中的多个缺失键?
【发布时间】:2021-11-03 20:16:12
【问题描述】:

我正在使用 API 来获取有关我所在地区商店的基本信息、商店名称、地址、邮政编码、电话号码等……API 返回一个关于每个商店的长列表,但我只想要一些数据从每个商店。

我创建了一个 for 循环,它只为 API 返回的每个商店获取我想要的信息。这一切都很好。

问题不是所有的商店都有电话号码或网站,所以我得到一个KeyError,因为在商店的每次退货中都不存在密钥website。我尝试使用tryexcept,但前提是我只处理一件事,但商店可能没有电话号码和网站,这会导致第二个KeyError

如何检查for 循环中的每个键,如果发现缺少键,只需添加值"none"

我的代码:

import requests
import geocoder
import pprint

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' # Acquire from developer.here.com
query = 'food'
limit = 12

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

# sending get request and saving the response as response object
r = requests.get(url = URL, params = PARAMS)
data = r.json()
#print(data)


for x in data['items']:
    title = x['title']
    address = x['address']['label']
    street = x['address']['street']
    postalCode = x['address']['postalCode']
    position = x['position']
    access = x['access']
    typeOfBusiness = x['categories'][0]['name']
    contacts = x['contacts'][0]['phone'][0]['value']

   try:
         website = x['contacts'][0]['www'][0]['value']
    except KeyError:
         website = "none"

    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)

【问题讨论】:

  • 这也是我尝试过的,但来自 API 的一些数据是数据列表,.get 不起作用。例如'contacts': [{'phone': [{'value': '+447415029531'}]}]
  • 这是简单键的小例子:值对,对于其他对,您需要添加更多过滤器以获得您想要的确切数据
  • 我可以很好地获取数据,我正在寻找如何为我的 for 循环中的所有变量处理 KeyError,因为并非每个商店都有网站或电话号码
  • 正如@sahasrara62 所写,使用dict.get(key, None) 就像这样:website = x.get("contacts",[{}])[0].get("www", [{}])[0].get("value", None) 这样您就不必处理错误,因为不会引发错误

标签: python api dictionary keyerror


【解决方案1】:

我认为处理它的一个好方法是使用operator.itemgetter() 创建一个可调用对象,它将尝试一次检索所有密钥,如果没有找到,它将生成一个KeyError

我的意思的简短演示:

from operator import itemgetter


test_dict = dict(name="The Shop", phone='123-45-6789', zipcode=90210)

keys = itemgetter('name', 'phone', 'zipcode')(test_dict)
print(keys)  # -> ('The Shop', '123-45-6789', 90210)

keys = itemgetter('name', 'address', 'phone', 'zipcode')(test_dict)
# -> KeyError: 'address'

【讨论】:

    猜你喜欢
    • 2017-05-20
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 2011-07-17
    • 2014-12-21
    • 1970-01-01
    相关资源
    最近更新 更多