在Python中缺少数据

问题描述:

我正在尝试将一个JSON文件导入到Python中以执行一些数据分析。每个JSON对象都有很多不同的变量(大约7-10)。一些对象具有某些变量,而另一些则不具有某些变量。我特别感兴趣的是来自每个json行的五个变量。但是,某些对象缺少数据。我该如何做到这一点,以便该程序将为每个缺失的数据设置一个无?在Python中缺少数据

import json 
data = [] 
keys = ["hostid","time", "userid","link", "title"] 
m = len(keys) 

with open('test.json') as json_data: 
    for line in json_data: 
     dataline = json.loads(line) 
     row = [] 
     for i in xrange(m): 
      row.append(dataline[keys[i]]) 
     data.append(row) 
json_data.close() 

data = np.array(data) 

以下是一些示例JSON对象。正如你所看到的,第一个对象有我想要的所有五个变量,但第二个对象没有“title”变量的数据。

{ 
"title": "Monster Man", 
"link": "http://monsters4ever.com/tagged/rosemary%27s%20baby%20(1968)", 
"userid": 130290, 
"field5": "lezmer Brunch at City Winery? Who Knew? -- Grub Street Chicago\"", 
"hostid": "3969937ab0a3e2db8690c482564006a7", 
"time": 376541 
} 

{ 
"link": "http://www.sfgate.com/world/article/WORLD-News-of-the-Day-From-Across-the-Globe-4120318.php", 
"userid": 227954, "field5": "ries « SHEfinds\"", 
"hostid": "6096407936827c96fa0833f26ab33b76", 
"time": 376541 
} 

有人能帮我吗?

+2

要在没有任何JSON结构知识的情况下努力帮助您。 –

+0

用无填写并用找到的键覆盖。 – Floris

+0

@弗洛伊斯我不明白你的意思。 – user3287712

我会用尝试。我也只是遍历键列表。

with open('test.json') as json_data: 
    for line in json_data: 
     dataline = json.loads(line) 
     row = [] 
     for i in keys:#iterate through keys 
      try: 
       row.append(dataline[i]) 
      except: 
       pass 
     data.append(row) 
json_data.close() 

当您尝试调用不存在的键时,您可以使用try,因为它应该抛出一个异常:

import json 
data = [] 
keys = ["hostid","time", "userid","link", "title"] 
m = len(keys) 

with open('test.json') as json_data: 
    for line in json_data: 
     dataline = json.loads(line) 
     row = [] 
     for i in xrange(m): 
      try: 
       row.append(dataline[keys[i]]) 
      except Exception: 
       row.append(None) 
     data.append(row) 
json_data.close() 

data = np.array(data) 

而不是填补缺失数据,当您尝试检索数据从对象中,而不是通常的:x['field'],请尝试x.get('field')

例如为:

with open('test.json') as json_data: 
    for line in json_data: 
     dataline = json.loads(line) 
     row = [] 
     for key in keys: 
      row.append(dataline.get(key)) 

     # better is: 
     # row = [dataline.get(key) for key in keys] 

     data.append(row) 

这工作,因为如果该键在字典中没有找到dict.get回报None


如果你真的不想做,你知道你想要的字段,你可以使用dict.setdefaultNone在那里:

for field in fields_you_care_about: 
    obj.setdefault(field, None) 
+0

您的意思不是'row.append(dataline [keys [i]])'使用'row.append(dataline [keys.get(i)])'? – user3287712

+0

@ user3287712 - 使用您的代码的修改版本进行更新。 – mgilson