无法访问boto3中的字典数据

时间:2017-04-06 15:15:18

标签: python dictionary

我正在使用boto3,我运行了这个循环:

for i in x["Instances"]
   print(i)

然后我得到:

{
    'AmiLaunchIndex': 0,
    'Hypervisor': 'xen',
    'VpcId': 'vpc-a790ac1',
    'Architecture': 'x86_64',
    'InstanceId': 'i-0bab3fb8314',
    'PrivateDnsName': 'ip-10-c2.internal',
    'BlockDeviceMappings': [{
        'Ebs': {
            'DeleteOnTermination': True,
            'AttachTime': datetime.datetime(2017, 4, 4, 20, 44, 27, tzinfo = tzutc()),
            'VolumeId': 'vol-07fd506f45',
            'Status': 'attached'
        },
        'DeviceName': '/dev/xvda'
    }, {
        'Ebs': {
            'DeleteOnTermination': False,
            'AttachTime': datetime.datetime(2017, 4, 6, 1, 12, 45, tzinfo = tzutc()),
            'VolumeId': 'vol-01ef36c45',
            'Status': 'attached'
        },
        'DeviceName': '/dev/sdf'
    }],
    'RootDeviceName': '/dev/xvda',
    'InstanceType': 't2.micro',
    'EnaSupport': True,
    'ClientToken': 'ODrMT1465413',
    'EbsOptimized': False,
    'SubnetId': 'subnet-fb1a4',
    'Monitoring': {
        'State': 'disabled'
    },
    'PublicDnsName': '',
    'StateTransitionReason': 'User initiated (2017-04-06 01:15:22 GMT)',
    'PrivateIpAddress': '10.10.4.116',
    'RootDeviceType': 'ebs',
    'Tags': [{
        'Value': 'wp2',
        'Key': 'Name'
    }, {
        'Value': 'true',
        'Key': 'backup'
    }],
    'ImageId': 'ami-0976f01f',
    'StateReason': {
        'Code': 'Client.UserInitiadShutdown',
        'Message': 'Client.UserInitiatedShutdown: User initiated shutdown'
    },
    'KeyName': 'pair2',
    'ProductCodes': [],
    'State': {
        'Name': 'stopped',
        'Code': 80
    },
    'LaunchTime': datetime.datetime(2017, 4, 6, 1, 13, 1, tzinfo = tzutc()),
    'Placement': {
        'AvailabilityZone': 'us-east-1b',
        'GroupName': '',
        'Tenancy': 'default'
    },
    'SourceDestCheck': True,
    'NetworkInterfaces': [{
        'Description': 'Primary network interface',
        'PrivateIpAddress': '10.10.4.116',
        'PrivateIpAddresses': [{
            'Primary': True,
            'PrivateIpAddress': '10.10.4.116'
        }],
        'Status': 'in-use',
        'SubnetId': 'subnet-ffbcba4',
        'VpcId': 'vpc-a790a7c1',
        'Attachment': {
            'DeleteOnTermination': True,
            'AttachTime': datetime.datetime(2017, 4, 4, 20, 44, 26, tzinfo = tzutc()),
            'DeviceIndex': 0,
            'AttachmentId': 'eni-attach-c8398',
            'Status': 'attached'
        },
        'Ipv6Addresses': [],
        'OwnerId': '895548',
        'MacAddress': '0e:31:4c4:b6',
        'Groups': [{
            'GroupId': 'sg-26c59',
            'GroupName': 'web-dmz'
        }],
        'NetworkInterfaceId': 'eni-5383',
        'SourceDestCheck': True
    }],
    'SecurityGroups': [{
        'GroupId': 'sg-2cab59',
        'GroupName': 'web-dmz'
    }],
    'VirtualizationType': 'hvm'
}

我试图访问' VolumeId'使用类似的东西:

for x in ["BlockDeviceMappings"][0]["Ebs"]["VolumeId"]:
   print(x)

我得到TypeError: string indices must be integers

看起来像BlockDeviceMappings'以包含字典的列表开头,但我无法进入' VolumeId'。

我也尝试过:

for x in ["BlockDeviceMappings"][0]:
   for k,v in ["Ebs"]:
      print(v)

我得到了:

ValueError: too many values to unpack (expected 2)

我试过了:

 for x in ["BlockDeviceMappings"][0]:
    for v in ["Ebs"]:
       print(v)

打印' Ebs'好几次。

有人可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

要获得VolumeId,请使用

print x["Instances"][0]["BlockDeviceMappings"][0]["Ebs"]["VolumeId"]
你错过了x或_。 您收到错误,因为[" BlockDeviceMappings"] [0]评估为" B"。 所以你想要获得" orb"来自" B"

获取所有卷:

for i in x["Instances"]:
    for b in i["BlockDeviceMappings"]
        print b["Ebs"]["VolumeId"]

如果您必须经常从复杂的结构中提取数据,请尝试使用github.com/akesterson/dpath-python之类的奇怪搜索库,它可以使用关键字提取数据