web-dev-qa-db-ja.com

pythonを使用してJSONファイルからデータの一部を抽出します

JSONファイルから特定のデータのみを抽出しようとしています。私はなんとかJSONをデコードして、必要なデータをpython dictに入れました。dictを印刷すると、必要なデータがすべて表示されますが、新しいファイルにdictを書き込もうとすると、最後のオブジェクトのみが書き込まれます。私が理解できないことの1つは、dictを出力したときに、期待したとおりに1ではなく複数のdictsオブジェクトが取得される理由です。

私のコード:

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が「title」を出力するのかを知りたいのですが、u'Diego Vel\xe1zquez 'ですが、印刷するとmy_dict.values()[2]と表示されます。

どうもありがとう

5
Torostar

コードは、次のようにして、オブジェクトごとに新しいディクショナリオブジェクトを作成します。

my_dict={}

さらに、それは変数の以前の内容を上書きします。 Oldm_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 'では、最初のはUnicodeオブジェクト(文字列)を示します。オブジェクトを使用して印刷すると、OSの現在の言語設定に従ってデコードされます。

9
jms

これを行うと:

for item in json_decode:

ファイルの各行をループしています。

ループを実行するたびにmy_dict変数をオーバーライドしているため、出力に1行しか表示されません。

ファイルを読み込んだら、json_decode変数を使用して、必要な処理を実行します。

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

1
Spencer