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

时间:2018-01-08 03:26:59

标签: python mysql json list dictionary

我是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)。

3 个答案:

答案 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

这样,应填写缺失值。