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 []:
这只是一个空循环,根本不会 运行。
我正在尝试遍历一些 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 []:
这只是一个空循环,根本不会 运行。