2014-02-14 108 views
0

我正在嘗試將一個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

回答

1

我會用嘗試。我也只是遍歷鍵列表。

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() 
1

當您嘗試調用不存在的鍵時,您可以使用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) 
6

而不是填補缺失數據,當您嘗試檢索數據從對象中,而不是通常的: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