Python KeyError如果逻辑或尝试逻辑

时间:2016-11-10 15:42:45

标签: python python-3.x dictionary keyerror

我试图循环浏览一些JSON数据以导出到CSV并且一切顺利,直到我得到一些我需要获取某些字段值的数据,其中这些字段并不总是存在于& #34;标记"

我收到错误:

for alarm in tag["alarmst"]:
        KeyError: 'alarmst'

我相信从Built-in Exceptions读到这意味着键/字段不存在。

我在Errors and Exceptions读到我可以将此逻辑放在 try语句中说,如果此密钥不存在,请不要给我错误并执行某些操作否则或移动到"标记"下面的下一组记录。哪里"闹钟"是,只是将该(以及指定的其他字段)转储到文件中。

我无法弄清楚如何告诉这个逻辑停止向我发出这个错误,并且只使用csv_file.writerow()函数和所有字段值,如果只是"闹钟"存在。

由于我将在这个Python进程运行之前使用一个文件和进程,因此将获得" devs"和#34;标签"对于他们自己的CSV文件,我无法解析数据并减少for循环中的for循环。

我不确定if tag["alarmst"] in tag:的问题是否是由于其他地方存在如此多的for循环,或者我是否需要以某种方式使用try语句,或者如果我'我只是没有正确地做其他事情,因为我在这个编码级别对Python不熟悉,但它似乎适用于迄今为止的需要。

我在Windows 10操作系统上运行此操作,如果这有任何区别,但我认为它没有。

启动代码:

import json
import csv

with open('C:\\folder\\dev\\TagAlarms.txt',"r") as file:
    data = json.load(file)

with open('C:\\folder\\dev\\TagAlarms.csv',"w",newline='') as file:
    csv_file = csv.writer(file)
    for dev in data["devs"]:
        for tag in dev["tags"]:
            for alarm in tag["alarmst"]:
                csv_file.writerow(alarm['dateStatus'],[alarm['dateStart'], alarm['status'], alarm['type']])

如果代码:

import json
import csv

with open('C:\\folder\\dev\\TagAlarms.txt',"r") as file:
    data = json.load(file)

with open('C:\\folder\\dev\\TagAlarms.csv',"w",newline='') as file:
    csv_file = csv.writer(file)
    for dev in data["devs"]:
        for tag in dev["tags"]:
            for alarm in tag["alarmst"]:
                if tag["alarmst"] in tag:
                    csv_file.writerow(alarm['dateStatus'],[alarm['dateStart'], alarm['status'], alarm['type']])

1 个答案:

答案 0 :(得分:6)

tag["alarmst"]是引发错误的原因。这意味着从tag获取与密钥"alarmst"关联的值,并且没有这样的密钥,因此它会失败。 if tag["alarmst"] in tag会抛出相同的错误,而且如果它低于for alarm in tag["alarmst"]:,您甚至无法达到这一点。你想要的是:

if "alarmst" in tag:
    for alarm in tag["alarmst"]:

但更好的是:

for alarm in tag.get("alarmst", []):

get类似于通常的方括号访问,但如果找不到密钥则第二个参数是默认值。因此,如果"alarmst"不在字典中,则基本上是:

for alarm in []:

这只是一个根本不会运行的空循环。