2017-12-01 16 views
0

AWSから私に返される辞書オブジェクトがあります。この辞書からタグ "based_on_ami"を引き出す必要があります。私はリストに変換しようとしましたが、プログラミングに慣れていないので、タグにアクセスする方法を理解できませんでした。Python 3辞書オブジェクトからタグを取得します。 AWS Boto3 Python 3

私が辞書からそのタグを取り出して、それを私が使用できる変数に入れる最良の方法は何ですか?

{ 
 
    'Images':[ 
 
     { 
 
     'Architecture':'x86_64', 
 
     'CreationDate':'2017-11-27T14:41:30.000Z', 
 
     'ImageId':'ami-8e73e0f4', 
 
     'ImageLocation':'23452345234545/java8server_ubuntu16-2b71edd1-f95e-4ee5-8fd6-d8a46975fdb5', 
 
     'ImageType':'machine', 
 
     'Public':False, 
 
     'OwnerId':'23452345234545', 
 
     'State':'available', 
 
     'BlockDeviceMappings':[ 
 
      { 
 
       'DeviceName':'/dev/sda1', 
 
       'Ebs':{ 
 
        'Encrypted':False, 
 
        'DeleteOnTermination':True, 
 
        'SnapshotId':'snap-0c10e8f5ced5b5240', 
 
        'VolumeSize':8, 
 
        'VolumeType':'gp2' 
 
       } 
 
      }, 
 
      { 
 
       'DeviceName':'/dev/sdb', 
 
       'VirtualName':'ephemeral0' 
 
      }, 
 
      { 
 
       'DeviceName':'/dev/sdc', 
 
       'VirtualName':'ephemeral1' 
 
      } 
 
     ], 
 
     'EnaSupport':True, 
 
     'Hypervisor':'xen', 
 
     'Name':'java8server_ubuntu16-2b71edd1-f95e-4ee5-8fd6-d8a46975fdb5', 
 
     'RootDeviceName':'/dev/sda1', 
 
     'RootDeviceType':'ebs', 
 
     'SriovNetSupport':'simple', 
 
     'Tags':[ 
 
      { 
 
       'Key':'service', 
 
       'Value':'baseami' 
 
      }, 
 
      { 
 
       'Key':'cloudservice', 
 
       'Value':'ami' 
 
      }, 
 
      { 
 
       'Key':'Name', 
 
       'Value':'java8server_ubuntu16-2b71edd1-f95e-4ee5-8fd6-d8a46975fdb5' 
 
      }, 
 
      { 
 
       'Key':'os', 
 
       'Value':'ubuntu 16.04 lts' 
 
      }, 
 
      { 
 
       'Key':'based_on_ami', 
 
       'Value':'ami-aa2ea8d0' 
 
      } 
 
     ], 
 
     'VirtualizationType':'hvm' 
 
     } 
 
    ], 
 
    'ResponseMetadata':{ 
 
     'RequestId':'2c376c75-c31f-4aba-a058-173f3b125a00', 
 
     'HTTPStatusCode':200, 
 
     'HTTPHeaders':{ 
 
     'content-type':'text/xml;charset=UTF-8', 
 
     'transfer-encoding':'chunked', 
 
     'vary':'Accept-Encoding', 
 
     'date':'Fri, 01 Dec 2017 18:17:53 GMT', 
 
     'server':'AmazonEC2' 
 
     }, 
 
     'RetryAttempts':0 
 
    } 
 
}

答えて

1
info = {...} 
tags = [] 
for image in info['Images']: 
    for tag in image['Tags']: 
     if tag['Key'] == 'based_on_ami': 
      tags.append(tag['Value']) 
print(tags) 
2

この種の問題にアプローチする最良の方法は、あなたが探している値を見つけ、次にあなたが解決策を見つけるまで、外側に働くことです。あなたはそれぞれのレベルにあるものを見る必要があります。

あなたは何を探していますか?あなたはbased_on_amiKeyValueを探しています。最終ステップは次のようになります:

if obj['Key'] == 'based_on_ami': 
    # do something with obj['Value']. 

しかし、どうやってそこに着きますか?オブジェクトはリストの内側にあるので、リストを繰り返し処理する必要があります:

for tag in <some list>: 
    if tag['Key'] == 'based_on_ami': 
     # do something with tag['Value']. 

このリストは何ですか?タグの一覧です:

for tag in image['Tags']: 
    if tag['Key'] == 'based_on_ami': 
     # do something with tag['Value']. 

タグはどこですか?リストに見つけるのイメージオブジェクトでは:

for image in image_list: 
    for tag in image['Tags']: 
     if tag['Key'] == 'based_on_ami': 
      # do something with tag['Value']. 

画像リストは、あなたの最初の辞書でImagesキーで見つかった値です。

image_list = my_data['Images'] 
for image in image_list: 
    for tag in image['Tags']: 
     if tag['Key'] == 'based_on_ami': 
      # do something with tag['Value']. 

そして今、あなたはそれらの値のすべてを収集しているので、あなたはlistが必要になるでしょうし、あなたがそれに追加する必要があります:

result = [] 
image_list = my_data['Images'] 
for image in image_list: 
    for tag in image['Tags']: 
     if tag['Key'] == 'based_on_ami': 
      result.append(tag['Value']) 

だから、私は上記のあなたの例を取りました、

{'ResponseMetadata': {'RequestId': '2c376c75-c31f-4aba-a058-173f3b125a00', 'RetryAttempts': 0, 'HTTPHeaders': {'vary': 'Accept-Encoding', 'transfer-encoding': 'chunked', 'server': 'AmazonEC2', 'content-type': 'text/xml;charset=UTF-8', 'date': 'Fri, 01 Dec 2017 18:17:53 GMT'}, 'HTTPStatusCode': 200}, 'Images': [{'Public': False, 'CreationDate': '2017-11-27T14:41:30.000Z', 'BlockDeviceMappings': [{'Ebs': {'SnapshotId': 'snap-0c10e8f5ced5b5240', 'VolumeSize': 8, 'Encrypted': False, 'VolumeType': 'gp2', 'DeleteOnTermination': True}, 'DeviceName': '/dev/sda1'}, {'VirtualName': 'ephemeral0', 'DeviceName': '/dev/sdb'}, {'VirtualName': 'ephemeral1', 'DeviceName': '/dev/sdc'}], 'OwnerId': '23452345234545', 'ImageLocation': '23452345234545/java8server_ubuntu16-2b71edd1-f95e-4ee5-8fd6-d8a46975fdb5', 'RootDeviceName': '/dev/sda1', 'ImageType': 'machine', 'Hypervisor': 'xen', 'RootDeviceType': 'ebs', 'State': 'available', 'Architecture': 'x86_64', 'Name': 'java8server_ubuntu16-2b71edd1-f95e-4ee5-8fd6-d8a46975fdb5', 'Tags': [{'Value': 'baseami', 'Key': 'service'}, {'Value': 'ami', 'Key': 'cloudservice'}, {'Value': 'java8server_ubuntu16-2b71edd1-f95e-4ee5-8fd6-d8a46975fdb5', 'Key': 'Name'}, {'Value': 'ubuntu 16.04 lts', 'Key': 'os'}, {'Value': 'ami-aa2ea8d0', 'Key': 'based_on_ami'}], 'EnaSupport': True, 'SriovNetSupport': 'simple', 'ImageId': 'ami-8e73e0f4'}, {'Public': False, 'CreationDate': '2017-11-27T14:41:30.000Z', 'BlockDeviceMappings': [{'Ebs': {'SnapshotId': 'snap-0c10e8f5ced5b5240', 'VolumeSize': 8, 'Encrypted': False, 'VolumeType': 'gp2', 'DeleteOnTermination': True}, 'DeviceName': '/dev/sda1'}, {'VirtualName': 'ephemeral0', 'DeviceName': '/dev/sdb'}, {'VirtualName': 'ephemeral1', 'DeviceName': '/dev/sdc'}], 'VirtualizationType': 'hvm', 'OwnerId': '23452345234545', 'ImageLocation': '23452345234545/java8server_ubuntu16-2b71edd1-f95e-4ee5-8fd6-d8a46975fdb5', 'RootDeviceName': '/dev/sda1', 'ImageType': 'machine', 'Hypervisor': 'xen', 'RootDeviceType': 'ebs', 'State': 'available', 'Architecture': 'x86_64', 'Name': 'java8server_ubuntu16-2b71edd1-f95e-4ee5-8fd6-d8a46975fdb5', 'Tags': [{'Value': 'baseami', 'Key': 'service'}, {'Value': 'ami', 'Key': 'cloudservice'}, {'Value': 'java8server_ubuntu16-2b71edd1-f95e-4ee5-8fd6-d8a46975fdb5', 'Key': 'Name'}, {'Value': 'ubuntu 16.04 lts', 'Key': 'os'}, {'Value': 'quack', 'Key': 'based_on_ami'}], 'EnaSupport': True, 'SriovNetSupport': 'simple', 'ImageId': 'ami-8e73e0f4'}]} 

マイ結果:

quackと別の based_on_amiノードを追加
['ami-aa2ea8d0', 'quack'] 
関連する問題