Разбор JSON-словаря в списке Python 3.6 - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь разобрать ответ JSON на вызов boto3 describe_isntances().Ответ представляет собой словарь в списке.Я не получаю вывод, который я ожидаю.Мне нужно разобрать словарь для Value из Key, когда Key равно email.Мне также нужно напечатать предупреждение, если эта пара ключ / значение не существует в ответе.На данный момент я застрял.Ниже приведен мой код, пример JSON, ожидаемый вывод и вывод:

CODE:

import boto3
import json

conn = boto3.resource('ec2')
client = boto3.client('ec2')

instances = conn.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])

for instances in instances:
    host_ids = instances.id
    email_tag = client.describe_tags(Filters=[{'Name': 'resource-id','Values': [host_ids,]}])
    for item in email_tag['Tags']:
        if item['Key'] == 'email':
            tag_value = item['Value']
        else:
            tag_value = print("Tag not found!")
    print(host_ids,tag_value)

JSON:

{'Tags': [{'Key': 'AZ', 'ResourceId': 'i-xxxxxxx', 
'ResourceType': 'instance', 'Value': '2'}, {'Key': 'KubeClusterId', 
'ResourceId': 'i-xxxxxxxx', 'ResourceType': 'instance', 
'Value': 'bug-fix'}, {'Key': 'NodeNum', 
'ResourceId': 'i-xxxxxxxxx', 'ResourceType': 'instance', 
'Value': '1'}, {'Key': 'KubeType', 'ResourceId': 'i-xxxxxx', 
'ResourceType': 'instance', 'Value': 'Node'}, {'Key': 'Name', 
'ResourceId': 'i-xxxxxxx', 'ResourceType': 'instance', 
'Value': 'bug-fix'}, {'Key': 'Tier', 'ResourceId': 
'i-xxxxxxx', 'ResourceType': 'instance', 'Value': 
'internal'}, {'Key': 'application_name', 'ResourceId': 'i-xxxxxx', 'ResourceType': 'instance', 'Value': 'bz'}, 
{'Key': 'cost_center', 'ResourceId': 'i-xxxxxxxx', 
'ResourceType': 'instance', 'Value': 'xxxx'}, {'Key': 'email', 
'ResourceId': 'i-xxxxxxxx', 'ResourceType': 'instance', 
'Value': 'foo@bar.com'}, {'Key': 'environment', 
'ResourceId': 'i-xxxxxx', 'ResourceType': 'instance', 
'Value': 'test'}, {'Key': 'initiative_number', 'ResourceId': 'i-xxxxxx', 'ResourceType': 'instance', 'Value': 'inxxxxx'}, 
{'Key': 'kube_env', 'ResourceId': 'i-xxxxxxxx', 
'ResourceType': 'instance', 'Value': 'bug-fix'}, {'Key': 
'portfolio', 'ResourceId': 'xxxxxx', 'ResourceType': 
'instance', 'Value': 'px'}, {'Key': 'utan', 'ResourceId': 'i-xxxxxx', 'ResourceType': 'instance', 'Value': 
'blazewater'}], 'ResponseMetadata': {'RequestId': 'dhdhdhdhdhdhd', 'HTTPStatusCode': 200, 'HTTPHeaders': {'content- 
type': 'text/xml;charset=UTF-8', 'content-length': '3171', 'vary': 
'Accept-Encoding', 'date': 'Tue, 04 Dec', 'server': 
'AmazonEC2'}, 'RetryAttempts': 0}}

EXPECTED OUTPUT:

i-xxxxxx foo@bar.com

или

i-xxxxxx Tag not found!

OUTPUT:

i-xxxxxx None

или

Tag not found!

1 Ответ

0 голосов
/ 05 декабря 2018

Вы продолжаете повторять цикл после нахождения нужного dict, который перезаписывает предыдущее значение.
Вы должны выйти из цикла, как только найдете нужное dict.

for instances in instances:
    host_ids = instances.id
    email_tag = client.describe_tags(Filters=[{'Name': 'resource-id','Values': [host_ids,]}])
    for item in email_tag['Tags']:
        if item['Key'] == 'email':
            tag_value = item['Value']
            # get out of loop if found
            break
    else:
        # tag value if not found
        tag_value = "Tag not found!"

    print(host_ids,tag_value)
...