2017-09-04 16 views
0

yamlファイルを読み込むPythonスクリプトがあります。引数はリストとして渡されるので、それらをループして辞書に値を追加できます。以下のコードはパラメータを追加しますが、jsonは現在のjson結果と希望するjson結果に適切に表示されません。適切な方向への助けに感謝します。ありがとう。Pythonの文字列からjsonへの変換

YAMLファイル

policies: 
    - name: ec2age 
    resource: ec2 
    filters:  
     - State.Name: running 
     - "tag:ResourceCreatedBy": present 
     - and: 
     - type: instance-age 
      days: 30 
      op: ge 

Pythonスクリプト:

#!/usr/bin/python 
import sys 
import argparse 
import json 
import yaml 

parser = argparse.ArgumentParser() 
parser.add_argument("-y", "--yaml_file", type=str) 
parser.add_argument("-b", "--business_unit", type=str) 
parser.add_argument("-p", "--platform", type=str) 
parser.add_argument("-c", "--client", type=str) 
args = parser.parse_args() 

with open(args.yaml_file, 'r') as stream: 
    data = yaml.load(stream) 

inner_dict = [args.business_unit, args.platform, args.client] 

for item in list(inner_dict): 
    data['policies'][0]['filters'][0]['tag:BUSINESS_UNIT'] = args.business_unit 
    data['policies'][0]['filters'][1]['tag:PLATFORM'] = args.platform 

print json.dumps(data) 

現在の結果:

{ 
"policies": [ 
    { 
    "resource": "ec2", 
    "name": "ec2age", 
    "filters": [ 
     { 
     "tag:BUSINESS_UNIT": "TEST_FLITE", 
     "State.Name": "running" 
     }, 
     { 
     "tag:ResourceCreatedBy": "present" 
     }, 
     { 
     "and": [ 
      { 
      "type": "instance-age", 
      "days": 30, 
      "op": "ge" 
      } 
     ] 
     } 
    ] 
    } 
] 
} 

望ましい結果:

{ 
"policies": [ 
    { 
    "resource": "ec2", 
    "name": "ec2age", 
    "filters": [ 
     { 
     "tag:BUSINESS_UNIT": "TEST_FLITE" 
     }, 
     { 
     "tag:PLATFORM": "Android" 
     }, 
     {    
     "State.Name": "running" 
     }, 
     { 
     "tag:ResourceCreatedBy": "present" 
     }, 
     { 
     "and": [ 
      { 
      "type": "instance-age", 
      "days": 30, 
      "op": "ge" 
      } 
     ] 
     } 
    ] 
    } 
] 
} 
+1

それはYAMLを見もせず、伝えるのは難しいようで、YAMLとisssueすることができます。 YAMLのタブを確認したり、dict/dataを印刷して確認したりできますか? –

答えて

1

inner_dict = [args.business_unit, args.platform, args.client] 

for item in list(inner_dict): 
    """ 
     following line appends adds key to 0'th dict which is 
    { 
    "tag:BUSINESS_UNIT": "TEST_FLITE", 
    "State.Name": "running" 
    } 
    """ 
    data['policies'][0]['filters'][0]['tag:BUSINESS_UNIT'] = args.business_unit 
    data['policies'][0]['filters'][1]['tag:PLATFORM'] = args.platform 

あなたはこのような何かを行うことができ、

#!/usr/bin/python 

from __future__ import print_function 
import sys 
import argparse 
import json 
import yaml 

parser = argparse.ArgumentParser() 
parser.add_argument("-y", "--yaml_file", type=str) 
parser.add_argument("-b", "--business_unit", type=str) 
parser.add_argument("-p", "--platform", type=str) 
parser.add_argument("-c", "--client", type=str) 
args = parser.parse_args() 

with open(args.yaml_file, 'r') as stream: 
    data = yaml.load(stream) 


inner_list = [{"tag:BUSINESS_UNIT" : args.business_unit}, 
       {"tag:PLATFORM" : args.platform}, 
       # {"tag:CLIENT" : args.client} #if needed 
      ] 

for i, item in enumerate(inner_list): 
    data['policies'][0]['filters'].insert(i, item) 

print(json.dumps(data)) 
+1

'insert'の良いアイデア!しかしOPは '{" tag:PLATFORM ":args.client}について何も言及していませんでした。しかし、必要であれば、そのキーを呼び出す方法を決定する必要があります。 – cezar

+0

これはありがとう!応答を感謝します。 – kilomo

1

あなたのコードのこの部分:

inner_dict = [args.business_unit, args.platform, args.client] 

for item in list(inner_dict): 
    data['policies'][0]['filters'][0]['tag:BUSINESS_UNIT'] = args.business_unit 
    data['policies'][0]['filters'][1]['tag:PLATFORM'] = args.platform 

は本当に多くの意味がありません。まず、inner_dictは既にリストです。もう一度リストに変換する理由はありません。list(inner_dict)

第2に、ループでは、リスト内のすべての項目に対して3回反復処理を行い、すべての反復手順で同じステートメントを繰り返します。これらの文ではitemを使用しません。

ここから、YAMLファイルの構造を知らなくても解決策を提示するのは難しいですが、上記の行を探してください。私は実行し、ループせずに試してみた:

data['policies'][0]['filters'].append({'tag:BUSINESS_UNIT': args.business_unit}) 
data['policies'][0]['filters'].append({'tag:PLATFORM': args.platform}) 

EDIT:あなたは私はあなたにさらなる説明を与えることができYAMLファイルの内容を追加した後。

[ 
    {    
     "State.Name": "running" 
    }, 
    { 
     "tag:ResourceCreatedBy": "present" 
    }, 
    { 
     "and": [ 
      { 
       "type": "instance-age", 
       "days": 30, 
       "op": "ge" 
      } 
     ] 
    } 
] 

その結果data['policies'][0]['filters'][0]が返されます::その辞書に値のペア:

{    
    "State.Name": "running" 
} 

data['policies'][0]['filters'][0]['tag:BUSINESS_UNIT'] = args.business_unitは、新しいキーを追加します

{    
    "State.Name": "running", 
    "tag:BUSINESS_UNIT": "TEST_FLITE" 
} 

あなたはこの部分を呼び出すdata['policies'][0]['filters']を呼び出す ループが役に立たない場合は、すべての繰り返しステップで同じことが行われます。

私の提案は、リストの最後に必要なキー:値のペアを辞書として追加します。注文が本当に重要な場合は、リストを移動する必要があります。モジュールcollections.dequeを見てください。あなたのコードで

+0

お返事ありがとうございます。 yamlファイルの内容を追加しました。 – kilomo

関連する問題