我是Python的新手,我遇到了一个非常具体的问题。我需要从具有类似结构的各种JSON文件中读取数据。过程是:将JSON文件加载到字典中,将dict中的相关数据保存在列表中,以便将其插入MySQL数据库。问题是:JSON文件的某些字段不一定出现在EVERY JSON文件中。某些文件中缺少某些字段,有时甚至在同一文件中,如:
"actions": [
{
"acted_at": "2014-12-10",
"action_code": "Intro-H",
"references": [],
"text": "Introduced in House",
"type": "action"
},
{
"acted_at": "2014-12-10",
"action_code": "H11100",
"committees": [
"HSWM"
],
"references": [],
"status": "REFERRED",
"text": "Referred to the House Committee on Ways and Means.",
"type": "referral"
},
{
"acted_at": "2014-12-12",
"action_code": "B00100",
"references": [
{
"reference": "CR E1800-1801",
"type": null
}
],
"text": "Sponsor introductory remarks on measure.",
"type": "action"
}
]
这是一个代码片段,用于说明我的程序的相关(问题)部分:
hr_list = []
with open("data.json") as json_data:
d = json.load(json_data)
actions_list.append((
d["actions"][j]["acted_at"],
d["actions"][j]["action_code"],
d["actions"][j]["status"],
d["actions"][j]["text"],
d["actions"][j]["type"]))
如您所见,文件有一定的一致性。问题是:每当其中一个字段不存在时,我会收到一个KeyError
,表示没有这样的数据可以追加到列表中。我需要做的是一种处理这个异常的方法,比如添加某种类型的" null"数据是默认的,因此它不会返回任何错误(无论如何,当添加到数据库时,它将为null)。
答案 0 :(得分:2)
首先,我将代码移出with
块。
actions_list = []
with open("data.json") as json_data:
d = json.load(json_data)
actions_list.append((
d["actions"][j]["acted_at"],
d["actions"][j]["action_code"],
d["actions"][j]["status"],
d["actions"][j]["text"],
d["actions"][j]["type"]))
其次,如果我要做你要求的事情,我会使用一个函数来获取值/可选/返回无。
actions_list = []
with open("data.json") as json_data:
d = json.load(json_data)
def f(d, j, k):
try:
return d["actions"][j][k]
except:
return None
actions_list.append((
f(j, "acted_at"),
f(j, "action_code"),
f(j, "status"),
f(j, "text")))
或者,您可以检查所有数据的键,作为验证步骤,然后检索值。
此外,您可以使用get
上的dict
功能获取value
key
(如果存在),如果不返回某个默认值。
d.get(k, "default_return_value")
如果您想安全地返回None
只是为了最深的巢,您可以执行以下操作
d["actions"][j].get("acted_at", None)
答案 1 :(得分:1)
您可以使用dict.get()
指定默认值,如:
with open("data.json") as json_data:
d = json.load(json_data)
actions_list.append((
d["actions"][j].get("acted_at", ''),
d["actions"][j].get("action_code", ''),
d["actions"][j].get("status", ''),
d["actions"][j].get("text", ''),
d["actions"][j].get("type", '')
))
答案 2 :(得分:1)
你自己提到它。使用try-catch逻辑,您可以捕获特定错误并处理它们,而不会破坏程序的执行,从而填充空数据点。
因此,使用您的代码段,使用try
围绕附加方法,然后添加except
。这是关于try-catch逻辑的python文档。 https://docs.python.org/3/tutorial/errors.html#handling-exceptions
hr_list = []
with open("data.json") as json_data:
d = json.load(json_data)
dict_keys = ["acted_at","action_code","status","text","type"]
for d_key in dict_keys:
try:
actions_list.append(d["actions"][j][d_key])
except KeyError as e:
cause = e.args[0]
actions_list.append((d["actions"][j][cause] = NULL))
您提到的例外情况keyerror已记录在案here。然后对于KeyError
,第一个参数是引发异常的键。这样,您就可以将违规密钥存储在cause
。
这样,应填写缺失值。