Python KeyError if 逻辑或尝试逻辑

Python KeyError if logic or try logic

我正在尝试遍历一些 JSON 数据以导出到 CSV 并且一切进展顺利,直到我获得我需要获取某些字段值的部分数据,而这些字段没有总是存在于 "tags".

之下

我收到以下错误:

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

我相信 Built-in Exceptions 读到这意味着 key/field 根本不存在。

我在 Errors and Exceptions 中读到我可以把这个逻辑放在 try 语句中 说,如果这个键不存在,请不要给我错误并执行其他操作或移动到 "tag" 下面的下一组记录,其中 "alarmst" 是并将其(以及指定的其他字段)转储到文件中。

我无法弄清楚如何告诉这个逻辑停止给我这个错误,并且只在 "alarmst" 存在的情况下对所有字段值使用 csv_file.writerow() 函数。

由于在此 Python 进程运行之前我将使用一个文件和进程将 "devs" 和 "tags" 获取到它们自己的 CSV 文件,因此我无法解析数据并减少另一个 for 循环中的 for 循环。

我不确定 if tag["alarmst"] in tag: 的问题是否是由于其他人中有太多 for 循环,或者我是否需要以某种方式使用 try 语句,或者我只是由于我是 Python 这个编码级别的新手,所以没有正确地做其他事情,但到目前为止它似乎可以满足需要。

我 运行 这个 Windows 10 OS 如果这有什么不同,但我认为没有。

起始代码:

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

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