2017-10-26 13 views
1

これは私のプログラムで解析しようとしているcred.jsonのファイルです。PythonでネストされたJSONファイルから値にアクセスする

{"accounts":[ 
     { 
       "id":"1", 
       "username":"user1", 
       "password":"password1" 
     }, 
     { 
       "id":"2", 
       "username":"user2", 
       "password":"password2" 
     } 
]} 

ここに私が使用するコードがあります。これはうまくいきますが、それを行う最良の方法ではないことがわかります。

import json 

with open('cred.json') as cred_file: 
     parsed_json = json.load(cred_file) 
     cred_file.close 

     for x in range(0,2): 
       user = parsed_json["accounts"][x]["username"] 
       password = parsed_json["accounts"][x]["password"] 
       print user, ":", password 

ループの範囲を指定せずに同じことをしたいと思います。私がiteritems()またはget()と同じことをしようとすると、unicodeがこれらの機能をサポートしていないと言ってエラーが出ます。

これを行うにはもっと良い方法を提案してください。

答えて

3

parsed_jsonは、dictがロードされ、dictsとして値がアカウントのリストである1つのキー "account"を含みます。だからではなく、範囲+索引参照、直接アカウントリストをループでやって:あなたはwithコンテキストを終了した後、それが閉じているので

for account in parsed_json["accounts"]: 
    user = account["username"] 
    password = account["password"] 
    print user, ":", password 

はまた、あなたは(ところでcred_file.close()する必要があります)cred_file.closeを必要としません。正しい方法は次のようになります。Pythonの3

import json 
with open('cred.json') as f: 
    lines_read = f.readlines() 

json_str = ''.join(lines_read) 
json_dict = json.loads(json_str) 

for account in json_dict['accounts']: 
    user = account['username'] 
    password = account['password'] 
    print(user, ':', password) 

with open('cred.json') as cred_file: 
    parsed_json = json.load(cred_file) 

for account in parsed_json["accounts"]: 
    user = account["username"] 
    password = account["password"] 
    print user, ":", password 
+0

ありがとうございます。私は「アカウント」がリストであることに気付かなかった。 – hax

0

を基本的な考え方は、Pythonのイテレータを使用することです。

関連する問題