web-dev-qa-db-fra.com

Extraire une partie des données d'un fichier JSON avec python

J'ai essayé d'extraire uniquement certaines données d'un fichier JSON. J'ai réussi à décoder le JSON et à obtenir les données voulues dans un dict Python. Lorsque j'imprime le dict, il affiche toutes les données demandées, mais lorsque j'essaie d'écrire le dict dans un nouveau fichier, seul le dernier objet est écrit. Une chose que je ne comprends pas, c’est aussi pourquoi, lorsque j’imprime un dict, j’obtiens plusieurs objets de dict au lieu de 1 comme je l’attendais.

Mon code:

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

mon fichier 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"}
]

affiche le résultat de 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'}

sortie dans le fichier test.json:

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

De plus, j'aimerais savoir pourquoi le dict génère le 'titre': u'Diego Vel\xe1zquez ' Mais si je vais imprimer my_dict.values ​​() [2] i Obtenez le nom écrit normalement sous le nom de Diego Velázquez. 

Merci beaucoup

4
Torostar

Votre code crée un nouvel objet dictionnaire pour chaque objet avec:

my_dict={}

De plus, il écrase le contenu précédent de la variable. Ancien dictionnaire dans m_dict est supprimé de la mémoire.

Essayez de créer une liste avant votre boucle for et y stocker le résultat.

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)

Enfin, écrivez le résultat dans la sortie:

back_json=json.dumps(result, output_file)

L’impression de l’objet dictionnaire a pour but d’aider le développeur en indiquant le type des données. Dans u'Diego Vel\xe1zquez ', u au début indique un objet Unicode (chaîne). Lorsque l’objet using est imprimé, il est décodé en fonction des paramètres de langue actuels de votre système d’exploitation.

7
jms

Quand tu fais ça:

for item in json_decode:

Vous parcourez chaque ligne du fichier.

Chaque fois que vous passez dans la boucle, vous écrasez la variable my_dict. C'est pourquoi vous n'obtenez qu'une seule ligne dans votre sortie.

Une fois que vous avez chargé le fichier, vous pouvez simplement imprimer la variable json_decode pour faire ce que vous voulez.

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

1
Spencer