2014-02-14 4 views
0

일부 데이터 분석을 위해 Python으로 JSON 파일을 가져 오려고합니다. 각 JSON 객체에는 다양한 변수가 있습니다 (약 7-10). 일부 오브젝트는 특정 변수를 가지지 만 다른 오브젝트는 그렇지 않습니다. 나는 각각의 json 라인에서 특별히 5 개의 변수에 관심이있다. 그러나 일부 개체에는 누락 된 데이터가 있습니다. 프로그램이 누락 된 모든 데이터에 대해 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

예외를 throw 할 필요가 있기 때문에 존재하지 않는 키를 호출 할 때 당신은 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') 시도하십시오.

예컨대 : 키가 사전에 dict.get 반환 None을 찾을 수없는 경우 때문에이 작동

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) 

. 당신이 정말로 그렇게하고 싶지 않아, 당신은 당신이 원하는 필드를 알고 있다면


, 당신은 거기에 None을 넣어 dict.setdefault를 사용할 수 있습니다

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

'row.append (dataline [keys [i]])'대신'row.append (dataline [keys [i]])'를 사용 하시겠습니까? – user3287712

+0

@ user3287712 - 수정 된 코드 버전으로 업데이트되었습니다. – mgilson

관련 문제