首页 > 解决方案 > Python - Json 数据打印但也给出 KeyError

问题描述

我正在尝试从从多个 URL 中提取的 JSON 数据中提取一个特定的密钥,我正在成功地执行此操作,但是,在数据打印之后,我出于某种原因得到一个 KeyError,这令人困惑,因为数据正在打印...... ..见下面的代码;

for url in URLs:
    data = requests.get(url, cookies=cookies, verify=False).json()
    notifications = data["notifications"]
    for notification in notifications:
        if notification["updates"].get("inDiscards", "outDiscards"):
            outDiscards = notification["updates"]["outDiscards"]["value"]["avg"]["float"]
            inDiscards = notification["updates"]["inDiscards"]["value"]["avg"]["float"]
            print(outDiscards, inDiscards)

我正在尝试提取 InDiscards 和 OutDiscards 的 AVG 浮点数

json数据如下:

{
 "notifications": [
  {
   "timestamp": "15002302302",
   "path_elements": [
    "Devices",
    "AAX1238128318",
    "versioned-data",
    "interfaces",
    "data",
    "Ethernet2",
    "aggregate",
    "rates",
    "1m"
   ],
 "updates": {
    "alignmentErrors": {
     "key": "alignmentErrors",
     "value": {
      "avg": {
       "float": 0
      },
      "max": {
       "float": 0
      },
      "min": {
       "float": 0
      },
      "stddev": {
       "float": 0
      },
      "weight": {
       "float": 1
      }
     }
    },
    "inDiscards": {
     "key": "inDiscards",
     "value": {
      "avg": {
       "float": 0
      },
      "max": {
       "float": 0
      },
      "min": {
       "float": 0
      },
      "stddev": {
       "float": 0
      },
      "weight": {
       "float": 1
      }
     }
    },
    "outDiscards": {
     "key": "outDiscards",
     "value": {
      "avg": {
       "float": 0
      },
      "max": {
       "float": 0
      },
      "min": {
       "float": 0
      },
      "stddev": {
       "float": 0
      },
      "weight": {
       "float": 1
      }
     }
    },

查看终端输出:

0 0
Traceback (most recent call last):
line 26, in <module>
    outDiscards = notification["updates"]["outDiscards"]["value"]["avg"]["float"]
KeyError: 'outDiscards'

如您所见, 0,0 打印正确但有错误

标签: pythonjsonpython-3.xpython-requests

解决方案


notification["updates"].get("inDiscards", "outDiscards")产生notification["updates"]["inDiscards"]if 它存在的值,"outDiscards"否则,不是(如您所假设的)两者都存在。


推荐阅读