如何从.json文件中的子键打印多个键值?

时间:2018-01-09 17:02:12

标签: json python-2.7 amazon-web-services

我从我的AWS账户中提取AMI ID列表并将其写入json文件。 json看起来基本上是这样的:

{
"Images": [
    {
        "CreationDate": "2017-11-24T11:05:32.000Z",
        "ImageId": "ami-XXXXXXXX"
    },
            {
        "CreationDate": "2017-11-24T11:05:32.000Z",
        "ImageId": "ami-aaaaaaaa"
    },
            {
        "CreationDate": "2017-10-24T11:05:32.000Z",
        "ImageId": "ami-bbbbbbb"
    },
            {
        "CreationDate": "2017-10-24T11:05:32.000Z",
        "ImageId": "ami-cccccccc"
    },
            {
        "CreationDate": "2017-12-24T11:05:32.000Z",
        "ImageId": "ami-ddddddd"
    },
            {
        "CreationDate": "2017-12-24T11:05:32.000Z",
        "ImageId": "ami-eeeeeeee"
    }
]

}

在收集信息并将其写入本地的.json文件后,我的代码到目前为止看起来像这样:

    #writes json output to file...
print('writing to response.json...')
with open('response.json', 'w') as outfile:
    json.dump(response, outfile, ensure_ascii=False, indent=4, sort_keys=True, separators=(',', ': '))

#Searches file...
print('opening response.json...')
with open("response.json") as f:
    file_parsed = json.load(f)

接下来我要介绍的是如何遍历文件并仅打印CreationDate和ImageId值。

print('printing CreationDate and ImageId...')
for ami in file_parsed['Images']:
    #print ami['CreationDate'] #THIS WORKS
    #print ami['ImageId']  #THIS WORKS
    #print ami['CreationDate']['ImageId']

无论我如何尝试,最后一行都给了我: TypeError:字符串索引必须是整数

我想要的输出是这样的:

2017-11-24T11:05:32.000Z ami-XXXXXXXX

最终我要做的是迭代特定日期或更早的行,并注销那些AMI。那么我会将这些转换为列表或词典吗? 几乎不是这里的程序员所以不要淹死我。 TIA

2 个答案:

答案 0 :(得分:1)

您几乎已经解析了json,但是对于所需的输出,您需要连接' CreationDate'和#ImageId'像这样:

for ami in file_parsed['Images']:
   print(ami['CreationDate'] + " "+ ami['ImageId'])

答案 1 :(得分:0)

CreationDate计算为字符串。因此,您只能获取字符串的数字索引,这就是['CreationDate']['ImageId']导致TypeError的原因。但是,你的其他两条注释行是正确的。

要检查日期是否较旧,您可以使用datetime模块。例如,您可以使用CreationDate(这是一个字符串),将其转换为datetime对象,根据特定日期创建自己的对象,并比较两者。

有这样的效果:

def checkIfOlder(isoformat, targetDate):
    dateAsString = datetime.strptime(isoformat, '%Y-%m-%dT%H:%M:%S.%fZ')
    return dateAsString <= targetDate

certainDate = datetime(2017, 11, 30) # Or whichever date you want

所以在你的for循环中:

for ami in file_parsed['Images']:
    creationDate = ami['CreationDate']
    if checkIfOlder(creationDate, certainDate):
        pass # write code to deregister AMIs here

有益的资源是Python's datetime documentation,特别是strftime/strptime directives。 HTH!