2015-08-20 34 views
0

boto的大部分输出都是以字典或列表的形式(与列表或字典中的字典嵌套)。如何在boto输出中访问嵌套子元素

我如何处理这个访问输出的每个元素。

如: 当我运行下面的代码:

import boto.rds2 
dbInstance = 'dummydb' 
region = 'ap-southeast-1' 
conn = boto.rds2.connect_to_region(region) 
db = conn.describe_db_instances(db_instance_identifier=dbInstance) 
print db 

输出是:

{u'DescribeDBInstancesResponse': {u'DescribeDBInstancesResult': {u'Marker': None, u'DBInstances': [{u'PubliclyAccessible': False, u'MasterUsername': u'horizon', u'LicenseModel': u'general-public-license', u'VpcSecurityGroups': [{u'Status': u'active', u'VpcSecurityGroupId': u'sg-xxxxxx'}, {u'Status': u'active', u'VpcSecurityGroupId': u'sg-xxxxxx'}], u'InstanceCreateTime': 123555, u'OptionGroupMemberships': [{u'Status': u'in-sync', u'OptionGroupName': u'default:mysql-5-6'}], u'PendingModifiedValues': {u'MultiAZ': None, u'MasterUserPassword': None, u'Port': None, u'Iops': None, u'AllocatedStorage': None, u'EngineVersion': None, u'BackupRetentionPeriod': None, u'DBInstanceClass': None, u'DBInstanceIdentifier': None}, u'Engine': u'mysql', u'MultiAZ': True, u'LatestRestorableTime': 1455555.0, u'DBSecurityGroups': [], u'DBParameterGroups': [{u'DBParameterGroupName': u'dummy-dbparametergroup', u'ParameterApplyStatus': u'pending-reboot'}], u'ReadReplicaSourceDBInstanceIdentifier': None, u'AutoMinorVersionUpgrade': True, u'PreferredBackupWindow': u'18:30-19:00', u'DBSubnetGroup': {u'VpcId': u'vpc-abcdef', u'Subnets': [{u'SubnetStatus': u'Active', u'SubnetIdentifier': u'subnet-abcdef', u'SubnetAvailabilityZone': {u'Name': u'ap-southeast-1a', u'ProvisionedIopsCapable': False}}, {u'SubnetStatus': u'Active', u'SubnetIdentifier': u'subnet-aa52e5dd', u'SubnetAvailabilityZone': {u'Name': u'ap-southeast-1b', u'ProvisionedIopsCapable': False}}], u'DBSubnetGroupName': u'dummysubnetgrp', u'SubnetGroupStatus': u'Complete', u'DBSubnetGroupDescription': u'DB Subnet Group'}, u'SecondaryAvailabilityZone': u'ap-southeast-1b', u'ReadReplicaDBInstanceIdentifiers': [], u'AllocatedStorage': 5, u'BackupRetentionPeriod': 7, u'DBName': u'horizon', u'PreferredMaintenanceWindow': u'sat:18:00-sat:18:30', u'Endpoint': {u'Port': 13306, u'Address': u'dummydb.c97xzgqljzmk.ap-southeast-1.rds.amazonaws.com'}, u'DBInstanceStatus': u'available', u'StatusInfos': None, u'EngineVersion': u'5.6.22', u'CharacterSetName': None, u'AvailabilityZone': u'ap-southeast-1a', u'Iops': None, u'DBInstanceClass': u'db.t2.micro', u'DBInstanceIdentifier': u'dummydb'}]}, u'ResponseMetadata': {u'RequestId': u'16786bd-4376-11e5-0b54-cf3492bd297a'}}} 

现在,我的要求是访问ParameterApplyStatus,所以我可以那么是否我应该决定或者重新启动我的数据库。

我试图通过更新打印一句话来访问内容如下:

print db["DescribeDBInstancesResponse"]["DescribeDBInstancesResult"]["DBInstances"] 

但输出我得到的是:

[{u'PubliclyAccessible': False, u'MasterUsername': u'horizon', u'LicenseModel': u'general-public-license', u'VpcSecurityGroups': [{u'Status': u'active', u'VpcSecurityGroupId': u'sg-xxxxxx'}, {u'Status': u'active', u'VpcSecurityGroupId': u'sg-xxxxxx'}], u'InstanceCreateTime': 123555, u'OptionGroupMemberships': [{u'Status': u'in-sync', u'OptionGroupName': u'default:mysql-5-6'}], u'PendingModifiedValues': {u'MultiAZ': None, u'MasterUserPassword': None, u'Port': None, u'Iops': None, u'AllocatedStorage': None, u'EngineVersion': None, u'BackupRetentionPeriod': None, u'DBInstanceClass': None, u'DBInstanceIdentifier': None}, u'Engine': u'mysql', u'MultiAZ': True, u'LatestRestorableTime': 1455555.0, u'DBSecurityGroups': [], u'DBParameterGroups': [{u'DBParameterGroupName': u'dummy-dbparametergroup', u'ParameterApplyStatus': u'pending-reboot'}], u'ReadReplicaSourceDBInstanceIdentifier': None, u'AutoMinorVersionUpgrade': True, u'PreferredBackupWindow': u'18:30-19:00', u'DBSubnetGroup': {u'VpcId': u'vpc-abcdef', u'Subnets': [{u'SubnetStatus': u'Active', u'SubnetIdentifier': u'subnet-abcdef', u'SubnetAvailabilityZone': {u'Name': u'ap-southeast-1a', u'ProvisionedIopsCapable': False}}, {u'SubnetStatus': u'Active', u'SubnetIdentifier': u'subnet-aa52e5dd', u'SubnetAvailabilityZone': {u'Name': u'ap-southeast-1b', u'ProvisionedIopsCapable': False}}], u'DBSubnetGroupName': u'dummysubnetgrp', u'SubnetGroupStatus': u'Complete', u'DBSubnetGroupDescription': u'DB Subnet Group'}, u'SecondaryAvailabilityZone': u'ap-southeast-1b', u'ReadReplicaDBInstanceIdentifiers': [], u'AllocatedStorage': 5, u'BackupRetentionPeriod': 7, u'DBName': u'horizon', u'PreferredMaintenanceWindow': u'sat:18:00-sat:18:30', u'Endpoint': {u'Port': 13306, u'Address': u'dummydb.c97xzgqljzmk.ap-southeast-1.rds.amazonaws.com'}, u'DBInstanceStatus': u'available', u'StatusInfos': None, u'EngineVersion': u'5.6.22', u'CharacterSetName': None, u'AvailabilityZone': u'ap-southeast-1a', u'Iops': None, u'DBInstanceClass': u'db.t2.micro', u'DBInstanceIdentifier': u'dummydb'}]} 

我如何打破它进一步下降,所以我可以访问输出中的每个元素。

回答

1

最后一个对象是一个实例列表,因此您需要处理该列表中的每个实例,但看起来输出只包含1个实例。

你应该能够做到以下几点:

import boto.rds2 
dbInstance = 'dummydb' 
region = 'ap-southeast-1' 
conn = boto.rds2.connect_to_region(region) 
db = conn.describe_db_instances(db_instance_identifier=dbInstance) 
instances = print db["DescribeDBInstancesResponse"]["DescribeDBInstancesResult"]["DBInstances"] 
for instance in instances: 
    if 'ParameterApplyStatus' in instance['DBParameterGroups'][0]: 
     print instance['DBParameterGroups'][0]['ParameterApplyStatus'] 

如果有帮助,你可以使用类似JSON皮棉与输出,了解如何获得最佳的结构元素