【问题标题】:Python KeyError if logic or try logicPython KeyError if 逻辑或尝试逻辑
【发布时间】:2016-11-10 15:42:44
【问题描述】:

我正在尝试遍历一些 JSON 数据以导出到 CSV,并且一切顺利,直到我获得需要获取某些字段值的部分数据,其中这些字段并不总是存在于“标签”下.

我收到以下错误:

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

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

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

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

由于我将在此 Python 进程运行之前处理一个文件和进程,因此我无法解析数据并减少另一个中的 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']])

【问题讨论】:

  • 你打错了:alarmSt 应该是alarmst?

标签: python python-3.x dictionary keyerror


【解决方案1】:

tag["alarmst"] 是引发错误的原因。这意味着从与键"alarmst" 关联的tag 获取值,并且没有这样的键,所以它失败了。 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 []:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2017-06-15
    • 2022-08-15
    相关资源
    最近更新 更多