【问题标题】:Array is present, but not recognize数组存在,但无法识别
【发布时间】:2017-05-01 18:28:16
【问题描述】:

我有一个偶尔为空或不存在的数组。我不断收到一条错误消息,说它不存在,但显然存在。这是错误消息:

Traceback(最近一次调用最后一次): 文件“C:\Users\ab67322\Desktop\python\Weather\weatheropen1.1.py”,第 23 行,在 雨 = n['雨'] KeyError: '雨'

非常感谢任何帮助。

NMNorthzip=[87401,87301]

for x in NMNorthzip:

    r = requests.get("http://api.openweathermap.org/data/2.5/forecast?zip="+str(x)+",us&appid=id")

    data = r.json()
    forecast = data['list']
    pprint(forecast)


    for n in forecast:
        if n['rain'] is None:
            print ("empty")
        else:
            print(n['rain'])

输出>>>

 {'clouds': {'all': 92},
  'dt': 1494093600,
   'dt_txt': '2017-05-06 18:00:00',
   'main': {'grnd_level': 822.44,
       'humidity': 62,
       'pressure': 822.44,
       'sea_level': 1018.05,
       'temp': 292.882,
       'temp_kf': 0,
       'temp_max': 292.882,
       'temp_min': 292.882},
  'rain': {'3h': 0.125},
  'sys': {'pod': 'd'},
  'weather': [{'description': 'light rain',
           'icon': '10d',
           'id': 500,
           'main': 'Rain'}],
   'wind': {'deg': 143.002, 'speed': 3.11}}]

【问题讨论】:

  • 缺少什么数组会引发异常?您能否将异常消息放入您的问题中,以便我们理解问题?
  • n['rain'] 是错误。我会更新帖子。

标签: python arrays json for-loop


【解决方案1】:

您可以检查,是否存在密钥rain

for n in forecast:
   if 'rain' in n:
       print(n['rain'])
   else:
       print('empty')

【讨论】:

  • 完美运行。谢谢。
  • Np dude;) 我们只是改变了一点逻辑。
【解决方案2】:

您假设您对requests..get() 的调用是成功的。您可能遇到网络问题、DNS 故障、服务器关闭或拒绝连接...

可以查看响应状态码:

>>> r = requests.get('http://httpbin.org/get')
>>> r.status_code
200

Requests 还带有一个内置的状态码查找对象以便于参考:

>>> r.status_code == requests.codes.ok
True

如果您发出了错误的请求(4XX 客户端错误或 5XX 服务器错误响应),您可以使用 Response.raise_for_status() 提出它:

>>> bad_r = requests.get('http://httpbin.org/status/404')
>>> bad_r.status_code
404

>>> bad_r.raise_for_status()
Traceback (most recent call last):
  File "requests/models.py", line 832, in raise_for_status
    raise http_error
requests.exceptions.HTTPError: 404 Client Error

【讨论】:

  • 这不是一个糟糕的请求,我已经按照问题所示对其进行了测试。
【解决方案3】:

forecast 是字典,字典有键。您有语句for n in forecast:,它将一次将这个字典中的每个键分配给n。在某些时候,n 将设置为rain,这是不可下标的(它既不是列表也不是字典)。

如果您想了解下雨,请忽略 for 声明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2016-06-02
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2021-08-20
    • 2018-06-22
    相关资源
    最近更新 更多