Python KeyError if logic或try logi

2024-09-27 23:18:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着循环一些JSON数据导出到CSV,一切都很顺利,直到我得到一部分数据,我需要获得某些字段值,这些字段并不总是存在于“标记”下。在

我得到的错误是:

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

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

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

我很难理解如何让这个逻辑停止给我这个错误,并且在只有“alarmst”存在的情况下才对所有字段值使用csv_file.writerow()函数。在

因为在这个Python进程运行之前,我将使用一个文件和进程将“devs”和“tags”转换为它们自己的CSV文件,所以我无法解析数据并减少其他for循环中的for循环。在

我不确定if tag["alarmst"] in tag:的问题是因为其他人中有太多for循环,还是我需要以某种方式使用try语句,或者我只是没有正确地执行其他操作,因为我是Python的新手,目前为止它似乎能满足需要。在

如果有什么不同的话,我会在Windows10操作系统上运行这个,但我想不会

起始代码:

^{pr2}$

如果代码:

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']])

Tags: 文件csv数据indevfortag错误
1条回答
网友
1楼 · 发布于 2024-09-27 23:18:20

{cd1>抛出的错误是什么。它意味着从与键"alarmst"相关联的tag中获取值,但是没有这样的键,所以它失败了。if tag["alarmst"] in tag将抛出相同的错误,而且,如果低于for alarm in tag["alarmst"]:,那么您甚至不会到达该点。你想要的是:

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

但更好的是:

^{pr2}$

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

^{3}$

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

相关问题 更多 >

    热门问题