我试图循环通过一些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 []:
,它只是一个空循环,根本不会运行