Python KeyError if logic or try logic



我试图循环通过一些JSON数据导出到CSV,一切都很顺利,直到我得到的数据的一部分,我需要得到某些字段值,这些字段并不总是存在于"标签"之下。

我得到错误:

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

我相信从内置异常读取,这意味着键/字段不存在。

我在错误和异常中读到,我可以把这个逻辑放在try语句中说,如果这个键不存在,不要给我错误并做其他事情或移动到"标签"下的下一组记录,其中"alarmst"是,只是转储(和其他指定的字段)到文件。

我有麻烦弄清楚如何告诉这个逻辑停止给我这个错误,如果只有"警报"存在,只使用csv_file.writerow()函数与所有字段值。

由于我将处理一个文件和进程,在这个Python进程运行之前,它将把"dev"one_answers"tags"获取到它们自己的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']])

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 []:

,它只是一个空循环,根本不会运行

最新更新