在python中添加一个包含从dict读取的数据的列表时如何处理异常,dict存储从.json文件读取的数据?

8wigbo56  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(478)

我是python新手,遇到了一个非常具体的问题。我需要从具有类似结构的各种json文件中读取数据。其过程是:将json文件加载到字典中,将dict中的相关数据保存在一个列表中,以便将其插入mysql数据库。问题是:json文件的某些字段不一定出现在每个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)。

yzxexxkh

yzxexxkh1#

你可以用 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", '')
    ))
rqqzpn5f

rqqzpn5f2#

首先,我要把代码从 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"]))

第二,如果我必须按你的要求做,我会使用一个函数来获取可选值/返回none。

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 为了得到 valuekey 如果存在,则返回一些默认值。

d.get(k, "default_return_value")

如果你想安全返回 None 对于最深的巢穴,你可以做以下几点

d["actions"][j].get("acted_at", None)
vsnjm48y

vsnjm48y3#

你是自己提的。使用try-catch逻辑,您可以捕获特定的错误并处理它们,而不会中断程序的执行,从而填充空数据点。
因此,在代码片段中,将append方法用 try ,然后添加 except 之后。下面是关于try-catch逻辑的python文档。https://docs.python.org/3/tutorial/errors.html#handling-例外情况

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,记录在这里。然后是一个 KeyError 第一个参数是引发异常的键。这样,您就可以在 cause .
这样,就可以填充缺少的值。

相关问题