2017-08-04 12 views
0

データをファイルに書きたいと思っていますが、データはそのソースによって異なる場合があります。Python:dictオブジェクトを動的に反復する方法は?

現時点では私のコードは、単に以下のん:

try: 
    file.write('{value1}'.format(value1=data["value1"])) 
except: 
    pass 

try: 
    file.write('{value2}'.format(value2=data["value2"])) 
except: 
    pass 

#... 

により、入力データの性質のために、これらの値のキーは、またはそれゆえ、なぜ私はときに上記をやっている、存在してもしなくてもよいです私はそれを無視することができますKeyErrorを取得します。

私の質問は、上記を行うためのより良い方法はありますか?このかなり濡れた解決策ではなく、もっと「ピジョンソニック」な方法ですか?

example_input1:

'{"value1": 1.0, "value2": 1.2}' 

example_input2:

'{"value2": 1.5}' 

私は最終的に私は、入力データを標準化する必要がありますね、残念ながらこれは、サードパーティのAPIから来ていることはそれほど本当にオプションではありません。

答えて

1

はい、あなたは簡単に使用することができます。

for key in ('value1','value2'): 
    if key in data: 
     file.write('{}'.format(data[key])) 

だからここif key in data最初にチェック辞書(例えば'value1')でキーがある場合。その場合、file.write('{}'.format(data[key]))を使用して、対応する値をファイルに書き込みます。

forループを使用する利点は、ファイルから印刷したいキーを簡単に追加したり削除したりできることです。

一方、あなたはwriteすべてのキー辞書にある、したい場合はすることができます辞書オーバー反復:

for val in data.values(): 
    file.write('{}'.format(val)) 

マインドしかしそのためのキーの /辞書内の値は挿入順である必要はありません。したがって値はシャッフルできます。

1

jsonライブラリを使用すると、入力文字列を辞書のようなオブジェクトに変換できます。

>>> import json 
>>> input1 = '{"value1": 1.0, "value2": 1.2}' 
>>> input2 = '{"value2": 1.5}' 
>>> input1 = json.loads(input1) 
>>> input2 = json.loads(input2) 
>>> for key in input1.keys(): 
... print(input1[key]) 
... 
1.2 
1.0 
>>> for key in input2.keys(): 
... print(input2[key]) 
... 
1.5 
1

注文はお使いの場合には重要でない場合は、以下のようなあなたのデータの上にだけループすることができます:

for v in data.values(): 
    file.write('{}'.format(v)) 

が出力:

>>> data = {"value1": 1.0, "value2": 1.2} 
>>> for v in data.values(): 
...  print(v) 
... 
1.2 
1.0 
>>> 
1

それは依存しますが、Iあなたが持っているすべてのデータを書きたくないと思うが、存在する場合はのほんの1つだけ。だからここ

はニシキヘビの方法(try/except)です:

inputs = [ 
    {"value1": "foo", "value2": "bar"}, 
    {"value1": "foo"}, 
    {"value3": "baz", 'unexpected': '??'} 
] 

expected_keys = ['value1', 'value2', 'value3'] 

for data in inputs: 
    for key in expected_keys: 
     try: 
      file.write(data[key]) 
     except KeyError: 
      pass 

inputsexpected_keysあなたは、彼らが入力に存在するかどう書きたいキーのリストで、例として使用dictのリストだけです。

既存のキーを見逃すことはなく、キーがない場合は決してKeyErrorを発行しないでください。

これは見Python's EAFP

、これを処理する本物のニシキヘビの方法です
関連する問題