2014-02-14 1 views
0

Я пытаюсь импортировать JSON-файл в Python для выполнения некоторого анализа данных. Каждый объект JSON имеет в нем много разных переменных (около 7-10). Некоторые объекты имеют определенные переменные, а другие объекты - нет. Меня интересует, в частности, пять переменных из каждой строки json. Однако некоторые объекты не имеют данных. Как мне сделать так, чтобы программа помещала None для всех отсутствующих данных?Отсутствующие данные в 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

@Floris Я не знаю, что вы подразумеваете под этим. – 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.setdefault поставить None там:

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

Вы имеете в виду вместо 'row.append (dataline [keys [i]])' use 'row.append (dataline [keys.get (i)])'? – user3287712

+0

@ user3287712 - обновлена ​​с измененной версией вашего кода. – mgilson

Смежные вопросы