【问题标题】:KeyError in console, but key exists and function works fine控制台中的 KeyError,但密钥存在且功能正常
【发布时间】:2017-09-10 16:13:38
【问题描述】:

我已经查看了此处的所有其他 keyerror 问题,但找不到能解决我的情况的问题。我正在从谷歌提取位置信息并将 json 信息读入 python 列表。以下是迭代 Google 结果的脚本部分。

results = []

# def get_data():
for term, (latitude, longitude, search_radius) in search_parameters.items():
    params = {
        'query': term,
        'location': (latitude, longitude),
        'radius': search_radius
    }
    geocode_result = gmaps.places(**params)
    for i in geocode_result['results']:

        results.append(i['name'])
        results.append(i['geometry']['location']['lat'])
        results.append(i['geometry']['location']['lng'])
        results.append(i['formatted_address'])
        results.append(i['opening_hours']['open_now'])
        results.append(i['price_level'])
        results.append(i['rating'])
        results.append(i['types'])

    if 'next_page_token' in geocode_result.keys():
        while 'next_page_token' in geocode_result.keys():
            time.sleep(2.5)
            params.update({'page_token': geocode_result['next_page_token']})
            geocode_result = gmaps.places(**params)
            for i in geocode_result['results']:
                results.append(i['name'])
                results.append(i['geometry']['location']['lat'])
                results.append(i['geometry']['location']['lng'])
                results.append(i['formatted_address'])
                results.append(i['opening_hours']['open_now'])
                results.append(i['price_level'])
                results.append(i['rating'])
                results.append(i['types'])
    else:
        break

    print(results)

这是一个 json 风格的 Python 代码示例。

[{
  'html_attributions': [],
  'next_page_token': 'CpQCBgEAAFzW9_qpkvmXV8sFiwXg6dEp2jsZXEqQOO4upW1U0FZPK0kiJvSmEbx4EuhAtDD4vtJcC4duqCj6oo0P68cRkGArenzZQWr61Wne0vA44R16SrfCDWLxQjqUu8zUcdLvdB7HfOHPMd7-KWK4cmX-6bLYIJldmnJBeqhnR5xmtB_TGlMyGlzh4vZ4kOB8dc1bnD6ijWxfFyz8wJ1ugA_5hZHLXtCY6NkE8TVYgTTV9710puKlKgiVSSkjwV3IsGgEhzixzGRrVHg2dB3Ehv2KHRuXnvIQJHr-CIkUoK79vI-45pyitdYlW1h9UQk_fzDsIeec3PNE5Qz6kN--NcDv-_jzFBr7QS2RGLkAcZX4aFdfEhCoP3MAVgjsl_tKdYaIX8y_GhSvCFZSxLfWVDAyF--7T6l32G0YFw',
  'results': [{
    'formatted_address': '2222 McKinney Ave, Dallas, TX 75201, United States',
    'geometry': {
      'location': {
        'lat': 32.7935,
        'lng': -96.8021119
      },
      'viewport': {
        'northeast': {
          'lat': 32.7948813802915,
          'lng': -96.8009040197085
        },
        'southwest': {
          'lat': 32.7921834197085,
          'lng': -96.8036019802915
        }
      }
    },
    'icon': 'https://maps.gstatic.com/mapfiles/place_api/icons/restaurant-71.png',
    'id': '26ba45975d09c8889ea321078b6bf10ceff07359',
    'name': 'Smashburger',
    'opening_hours': {
      'open_now': True,
      'weekday_text': []
    },
    'photos': [{
      'height': 3024,
      'html_attributions': ['<a href="https://maps.google.com/maps/contrib/107709113475800121508/photos">Terry Wint Jr</a>'],
      'photo_reference': 'CmRaAAAA9BPb8sP5KUp9bLAgSd9dPQzH15TkG3sw5T6qOa-WSV1hi-3DLIhVzWI5woD2GtSl3aktKXTXktLUfr9vpum-XywbqFMKunee-YhWwPtwOGJaO5lULU-g1px7Z6lPUFvqEhDrofF3_89I455YRKo2hZuFGhRilVDqXdt5x2jPieN3W07UvJwsvA',
      'width': 4032
    }],
    'place_id': 'ChIJ22Ci9y-ZToYRDw1hkXkjceY',
    'price_level': 1,
    'rating': 4.1,
    'reference': 'CmRSAAAAzQIvy0nuhTQpRoAFTlilcVY_BfqGFj7gNlpNeIecwOWGV1x0qFm80zkPYFYKtJ15ilHYSoQbDH2wsQ_vahw5ilhriHA0EBWavcyev4mYVgNWssL0neY5d7YwOLAgtSEvEhBN6e_DakrfQPVtqkagEtQ4GhRCdi5cZ6CKfk6AqXkuGJ9ZVpuR-A',
    'types': ['restaurant', 'food', 'point_of_interest', 'establishment']
  }, 

当我运行它时,我在终端中收到了这个回溯错误,但是当我打印我的结果时,一切都没有问题地返回。

Traceback (most recent call last):
  File "testing.py", line 52, in <module>
    results.append(i['price_level'])
KeyError: 'price_level'

【问题讨论】:

  • 您确定所有结果都有price_level吗?我无法通过复制和粘贴您的代码和示例文档来重现该问题
  • 是的,这就是我每次通过终端后返回的内容。 'Whataburger', 32.8594031, -96.768596, '6061 Greenville Ave, Dallas, TX 75206, United States', True, 1, 4, ['restaurant', 'food', 'point_of_interest', 'establishment'] price_level 是 1
  • 抱歉,我不清楚:给您异常的代码和输入是什么?
  • 原谅我,因为我还在努力学习python,但我不明白你在问什么。每当我尝试运行上面的 for 循环(这是脚本的大部分内容)时,我都会得到我想要的结果。我得到一个results 列表,其中包含我附加到它的所有项目。出于某种原因,尽管代码完全运行并给了我所有正确的信息,但我仍然在终端中得到一个KeyError: 'price_level'。这能回答你的问题吗?
  • 如果你得到一个输出然后是一个异常,我认为你正在查看的代码不是问题的原因。您确定testing.py 中的第 52 行与您在此处发布的代码相同吗?

标签: python json


【解决方案1】:

实际上“price_level”不在列表中。

geocode_result['price_level'] 就可以了

【讨论】:

  • 感谢您的关注!不敢相信我错过了。你能告诉我为什么我仍然得到 price_level 和列表之外的所有其他项目吗?
  • 感谢您的浏览。
  • 这是另一个问题。正如标题所说,您的问题是您的 keyError。这解决了,对吧?如果您还有其他问题(可能更全球化),请另开一张票。
【解决方案2】:

json 文件中的键必须用双引号引起来——老实说。

"在 JSON 中,键必须是字符串,用双引号写" 从这里:https://www.w3schools.com/js/js_json_syntax.asp

【讨论】:

  • 感谢参考,我试试看。
  • 发布在问题上的不是 JSON,而是解码后的 JSON 对象的 Python 表示。在 Python 中,双引号和单引号都可以
  • 这不仅仅是您的意见,它是规范的一部分。
  • @AndreaCorbellini 不确定(“这是它从中提取的 json 示例。”)
  • @SwiftsNamesake 这是我在终端收到的,但我相信它是基于 Python 的。我应该澄清一下。
【解决方案3】:

正如一些人直接和间接地指出的那样,我应该为我所面临的问题开一张新票。问题是我调用'price_level' 的值不是'geocode_result' 中的键。有些我仍然能够通过调用它来获取值,但是 keyerror 是在输出后触发的。现在我必须弄清楚如何将'price_level' 变成密钥。

感谢大家帮助解决这个问题。

事实证明,并非所有反馈的响应都包含我调用的所有密钥。这就是为什么它会像整个脚本一样运行,然后在 keyerror 接近尾声时停止。我将在 for 循环部分添加一条 try 语句。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 2016-08-26
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
相关资源
最近更新 更多