2014-02-15 3 views
1

Я пытаюсь разобрать изменения данных JSON, однако данные JSON немного сложны и меняют каждую итерацию.Анализ и изменение данных JSON в Python, несколько уровней глубоких

Данные JSON анализируются внутри цикла, поэтому каждый раз, когда цикл работает, данные json отличаются. Я сейчас сосредоточен на данных об образовании.

JSON DATA:

Сначала один может выглядеть следующим образом:

{u'gender': u'female', u'id': u'15394'} 

Следующая один может быть:

{ 
u'gender': u'male', u'birthday': u'12/10/1983', u'location': {u'id': '12', u'name': u'Mexico City, Mexico'}, u'hometown': {u'id': u'19', u'name': u'Mexico City, Mexico'}, 

u'education': [ 
{ 
u'school': {u'id': u'22', u'name': u'Institut Saint Dominique de Rome'}, 
u'type': u'High School', 
u'year': {u'id': u'33', u'name': u'2002'} 
}, 
{ 
u'school': {u'id': u'44', u'name': u'Instituto Cumbres'}, 
u'type': u'High School', 
u'year': {u'id': u'55', u'name': u'1999'} 
}, 
{ 
u'school': {u'id': u'66', u'name': u'Chantemerle International School'},  
u'type': u'High School', 
u'year': {u'id': u'77', u'name': u'1998'} 
}, 
{ 
u'school': {u'id': u'88', u'name': u'Columbia University'}, 
u'type': u'College', 
u'concentration': 
[{u'id': u'91', u'name': u'Economics'}, 
{u'id': u'92', u'name': u'Film Studies'}] 
} 
], 
u'id': u'100384'} 

Я пытаюсь вернуть все значения для школы имя, школьный номер и тип школы, поэтому по существу я хочу [education][school][id], [education][school][name], [education][school][type] в одной строке , Тем не менее, каждый человек имеет различное количество школ, перечисленных, а также разные типы школ или вообще нет школ. Я хочу вернуть каждую школу со своим именем, идентификатором и типом в новой строке в моем существующем цикле.

ИДЕАЛ ВЫХОД:

1 34 Boston Latin School High School 
1 26 Harvard University College 
1 22 University of Michigan Graduate School 

Тот, что в данном случае, относится к friend_id, который я уже создан, чтобы добавить в список в качестве первого элемента в каждом цикле.

Я пробовал:

friend_data = response.read() 
friend_json = json.loads(friend_data) 

#This below is inside a loop pulling data for each friend: 

try: 
    for school_id in friend_json['education']: 
     school_id = school_id['school']['id'] 
     friendedu.append(school_id) 
    for school_name in friend_json['education']: 
     school_name = school_name['school']['name'] 
     friendedu.append(school_name) 
    for school_type in friend_json['education']: 
     school_type = school_type['type'] 
     friendedu.append(school_type) 
except: 
    school_id = "NULL" 

печати friendedu writer.writerow (friendedu)

ТОКА ВЫВОД:

[u'22', u'44', u'66', u'88', u'Institut Saint Dominique de Rome', u'Instituto Cumbres', u'Chantemerle International School', u'Columbia University', u'High School', u'High School', u'High School', u'College']

Этот вывод просто список значений, которые он потянул, вместо этого я пытаюсь организовать вывод, как показано выше. Я думаю, что, возможно, требуется еще один цикл for-loop, поскольку для одного человека я хочу, чтобы каждая школа была на своей собственной линии. Сейчас список friendedu добавляет всю информацию об образовании для одного человека в каждую строку списка. Я хочу, чтобы каждый элемент образования появился в новой строке, а затем перешел к следующему человеку и продолжал писать строки для следующего человека.

ответ

1

как о

friend_data = response.read() 
friend_json = json.loads(friend_data) 


if 'education' in friend_json.keys(): 
    for school_id in friend_json['education']: 
     friendedu = [] 
     try: 
      friendedu.append(school_id['school']['id']) 
      friendedu.append(school_name['school']['name']) 
      friendedu.append(school_type['school']['type']) 
     except: 
      friendedu.append('School ID, NAME, or type not found') 
     print(" ".join(friendedu)) 
+0

Редактирование выше, похоже, решило проблему, спасибо – kegewe

+0

@kegewe Отлично, если бы ответ сработал для вас, не могли бы вы принять его в качестве решения? – Cam

1
import csv 
import json 
import requests 

def student_schools(student, fields=["id", "name", "type"], default=None): 
    schools = student.get("education", []) 
    return ((school.get(field, default) for field in fields) for school in schools) 

def main(): 
    res = requests.get(STUDENT_URL).contents 
    students = json.loads(res) 

    with open(OUTPUT, "wb") as outf: 
     outcsv = csv.writer(outf) 
     for student in students["results"]: # or whatever the root label is 
      outcsv.writerows(student_schools(student)) 

if __name__=="__main__": 
    main() 
+0

проблема заключается в том, что моя первая попытка, и за исключением раздела является частью гораздо больше для цикла. Мне нужно добавить другую переменную из другой части цикла в начало каждой строки 'friendedu'.Я уже вытащил данные JSON в friend_json, поэтому мне не нужно делать никаких дополнительных запросов URL. Я просто хочу поместить данные от каждого ученика в одну или несколько строк в списке «friendedu». Затем я хочу добавить эти 1 или более строк в файл csv ниже предыдущего ученика. – kegewe

1

Вам, конечно, не нужно больше для петель.

Один будет делать:

friendedu = [] 
for school_id in friend_json['education']: 
    friendedu.append("{id} {name} {type}".format(
     id=school_id['school']['id'], 
     name=school_name['school']['name'], 
     type=school_type['school']['type']) 

Или список понимание:

friendedu = ["{id} {name} {type}".format(
    id=school_id['school']['id'], 
    name=school_name['school']['name'], 
    type=school_type['school']['type']) for school_id in friend_json['education']] 
+0

Я получаю «ошибка ключевого слова: не ключевое слово arg после ключевого слова arg» – kegewe

+0

Я оставил 'type =' в последней строке. Обновлено. –

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