2015-01-29 2 views
3

Я пытаюсь извлечь только определенные данные из файла JSON. Мне удалось декодировать JSON и получить нужные данные в python dict. Когда я распечатываю dict, он показывает все нужные данные, но когда я пытаюсь записать dict в новый файл, записывается только последний объект. Одна вещь, которую я не могу понять, также, почему, когда я печатаю dict, я получаю несколько объектов dicts вместо 1, как и ожидалось.Извлечь часть данных из файла JSON с помощью python

Мой код:

import json 
input_file=open('json.json', 'r') 
output_file=open('test.json', 'w') 
json_decode=json.load(input_file) 
for item in json_decode: 
    my_dict={} 
    my_dict['title']=item.get('labels').get('en').get('value') 
    my_dict['description']=item.get('descriptions').get('en').get('value') 
    my_dict['id']=item.get('id') 
    print my_dict 
back_json=json.dumps(my_dict, output_file) 
output_file.write(back_json) 
output_file.close() 

мой файл json.json:

[ 
{"type":"item","labels":{"en":{"language":"en","value":"George Washington"}},"descriptions":{"en":{"language":"en","value":"American politician, 1st president of the United States (in office from 1789 to 1797)"}},"id":"Q23"}, 
{"type":"item","aliases":{"en":[{"language":"en","value":"Douglas Noël Adams"},{"language":"en","value":"Douglas Noel Adams"}]},"labels":{"en":{"language":"en","value":"Douglas Adams"}},"descriptions":{"en":{"language":"en","value":"English writer and humorist"}},"id":"Q42"}, 
{"type":"item","aliases":{"en":[{"language":"en","value":"George Bush"},{"language":"en","value":"George Walker Bush"}]},"labels":{"en":{"language":"en","value":"George W. Bush"}},"descriptions":{"en":{"language":"en","value":"American politician, 43rd president of the United States from 2001 to 2009"}},"id":"Q207"}, 
{"type":"item","aliases":{"en":[{"language":"en","value":"Velázquez"},{"language":"en","value":"Diego Rodríguez de Silva y Velázquez"}]},"labels":{"en":{"language":"en","value":"Diego Velázquez"}},"descriptions":{"en":{"language":"en","value":"Spanish painter who was the leading artist in the court of King Philip IV"}},"id":"Q297"}, 
{"type":"item","labels":{"en":{"language":"en","value":"Eduardo Frei Ruiz-Tagle"}},"descriptions":{"en":{"language":"en","value":"Chilean politician and former President"}},"id":"Q326"} 
] 

печати Выход my_dict:

{'id': u'Q23', 'description': u'American politician, 1st president of the United States (in office from 1789 to 1797)', 'title': u'George Washington'} 
{'id': u'Q42', 'description': u'English writer and humorist', 'title': u'Douglas Adams'} 
{'id': u'Q207', 'description': u'American politician, 43rd president of the United States from 2001 to 2009', 'title': u'George W. Bush'} 
{'id': u'Q297', 'description': u'Spanish painter who was the leading artist in the court of King Philip IV', 'title': u'Diego Vel\xe1zquez'} 
{'id': u'Q326', 'description': u'Chilean politician and former President', 'title': u'Eduardo Frei Ruiz-Tagle'} 

выход в файле test.json:

{"id": "Q326", "description": "Chilean politician and former President", "title": "Eduardo Frei Ruiz-Tagle"} 

Также я хотел бы знать, почему dict выводит «название»: u'Diego Vel \ xe1zquez ' , но если я иду, напечатайте my_dict.values ​​() [2] i Получите имя, написанное нормально, как Диего Веласкес.

Большое спасибо

+0

u'Diego Vel \ xe1zquez '- это представление Python Unicode, где \ xe1 - символ. –

+0

К вашему второму вопросу: если вы печатаете dict, вы получаете представление python строки (repr), тогда как печать строки дает вам «нормальное» представление (str). Взгляните на «repr» и «str» (http://satyajit.ranjeev.in/2012/03/14/python-repr-str.html) для получения дополнительной информации – BurningKarl

+0

спасибо за объяснение Я посмотрю – Torostar

ответ

7

Ваш код создает новый объект словаря для каждого объекта с:

my_dict={} 

Кроме того, он перезаписывает предыдущее содержимое переменной. Старый словарь в m_dict удален из памяти.

Попробуйте создать список перед циклом for и сохраните результат.

result = [] 
for item in json_decode: 
    my_dict={} 
    my_dict['title']=item.get('labels').get('en').get('value') 
    my_dict['description']=item.get('descriptions').get('en').get('value') 
    my_dict['id']=item.get('id') 
    print my_dict 
    result.append(my_dict) 

Наконец, записать результат на выходе:

back_json=json.dumps(result, output_file) 

Печать объект словаря призван помочь разработчику, показывая тип данных. В u'Diego Vel \ xe1zquez ', u в начале указывает объект Unicode (строка). Когда используется использование объекта, оно декодируется в соответствии с текущими языковыми настройками в вашей ОС.

+0

спасибо за код и объяснение, я вижу свою ошибку сейчас! – Torostar

+0

@Torostar вы должны отметить правильный ответ, как принято, если вы хотите, чтобы люди ответили на ваши вопросы. –

+0

спасибо за отзыв – Torostar

1

Когда вы сделаете это:

for item in json_decode: 

Вы зацикливания через каждую строку в файле.

Каждый раз, используя цикл, вы переопределяете переменную my_dict, поэтому вы получаете только одну строку в своем выходе.

Как только вы загрузите файл, вы можете просто распечатать переменную json_decode, чтобы сделать то, что вы хотите.

https://docs.python.org/3.3/library/json.html

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