2017-11-15 3 views
0

私はこのコードを(下記)持っています。私はjsonファイルにデータを持っており、データ(以下のコード)を取得します。私はこれらの値を圧縮し、csvファイルに書きます。 私の問題は、値のいずれかがtryに存在しない場合、その値のためにそこに「なし」を入れたいと思っています。私が試したこと(私は不自由だと思う) - >私は試しを加え、以下で取っている各値を除きました。私はこれをより良く書くのに助けが必要です。tryとexcept文を減らす必要があります

例外は、どの値が欠落しているかを示しています。たとえば、codeがありません。ですから、私はこれをexceptで処理し、の場合はNoneと書いていますか?

for i in range(len(res_1)): 
     try: 
      gp_code.append(res_1[i]['metadata']['annotations']['code']) 
      ticket.append(res_1[i]['metadata']['annotations']['ticket']) 
      node.append(res_1[i]['metadata']['annotations']['node-selector']) 
      display_name.append(res_1[i]['metadata']['name']) 
      status.append(res_1[i]['status']['phase']) 
      timer.append(res_1[i]['metadata']['creationTimestamp']) 
      lifetime.append(res_1[i]['metadata']['annotations']['lifetime']) 
     except Exception as e: 
      print(e) 
+2

を開始、あなたが ''私は範囲(len(...)) 'を書くときはいつでも間違っていることをほぼ確実にしています。あなたはいつも自分自身を繰り返し処理する必要があります: 'res_1の要素のために ' –

+0

私はあなたがこれを読む必要があると思うhttps://stackoverflow.com/questions/6130768/return-none-if-dictionary-key-is-not-available私はそれがあなたが望むことをすると思うので。キーが存在しないときはNoneを返す。また、 'dict_metadata = res_1 [i] ['metadata']'のようなステートメントを使って、使用しているネストされた辞書の複製部分を減らすことで、コードを単純化することができます。あなたまで、 –

+0

@ R.Sharp、あなたが言っていることを得る。私はこのようにしなければならない。ありがとう –

答えて

0

あなたは適切なデフォルト値でgetを使用してalltogether例外処理を避けることができます。

for x in res_1: 
    gp_code.append(x.get('metadata', {}).get('annotations', {}).get('code', None) 
    # ... 

それとも、関数内で例外処理/デフォルト値を入れることができますについては

def _append(lst, obj, *items): 
    try: 
     for item in items: 
      obj = obj[item] 
     lst.append(obj) 
    except KeyError: 
     lst.append(None) 

for x in res_1: 
    _append(gp_code, x, 'metadata', 'annotations', 'code') 
    # ... 
+0

最初のものを使用する。それは私のコードを理解しやすくする:)ありがとう –

関連する問題