【发布时间】:2017-09-27 01:25:59
【问题描述】:
Python 版本 2.7.10
我有这个脚本(它抓取 AWS EBS 卷元数据),它当前生成一个 key=value 对数据,它是每行输出的 CSV(逗号分隔值)。
Python 脚本:
#!/usr/bin/python
#Do `sudo pip install boto3` first
import boto3
import json
def generate(key, value):
"""
Creates a nicely formatted Key(Value) item for output
"""
return '{}={}'.format(key, value)
#if isinstance(value,int):
# return '\"{}\": {}'.format(key, value)
#else:
# return '\"{}\": \"{}\"'.format(key, value)
def main():
ec2 = boto3.resource('ec2', region_name="us-west-2")
volumes = ec2.volumes.all()
for vol in volumes:
if vol.state == "available":
vol_state_num_value = 1
else:
vol_state_num_value = 0
if vol.snapshot_id == "":
vol_snapshot_id = "None"
else:
vol_snapshot_id = vol.snapshot_id
output_parts = [
# Volume level details
generate('vol_id', vol.volume_id),
generate('az', vol.availability_zone),
generate('vol_type', vol.volume_type),
generate('size', vol.size),
generate('iops', vol.iops),
generate('snapshot_id', vol_snapshot_id),
generate('vol_state', vol_state_num_value),
]
# only process when there are tags to process
if vol.tags:
for _ in vol.tags:
# Get all of the tags
output_parts.extend([
generate(_.get('Key'), _.get('Value')),
])
# At last put volume state numberic value
# i.e. 0 (in-use) and 1 (available/unattached) volume
output_parts.extend([
generate('state', vol_state_num_value),
])
# output everything at once.
print ','.join(output_parts)
#print '{}{}{}'.format('{',output_parts,'}')
if __name__ == '__main__':
main()
目前它生成的输出如下所示:
vol_id=vol-0abcdab1b68111f8b,az=us-west-2b,vol_type=gp2,size=5,iops=100,snapshot_id=snap-0abcdab1b68111f8b,vol_state=0,mirror=primary,autoscale=true,cluster=customer,Name=[customer-2b-app41] primary,role=app,hostname=customer-2b-app41-i-0abcdab1b68111f8b,state=0
vol_id=vol-0abcdab1b68111f8c,az=us-west-2b,vol_type=gp2,size=12,iops=100,snapshot_id=snap-0abcdab1b68111f9c,vol_state=0,state=0
我正在尝试转换脚本,以便生成 JSON 对象,而不是每行生成 key=value 对 CSV 行。
我尝试使用脚本中所示的 IF 语句来调整脚本,即 isinstance() 用于值部分(用双引号将值括起来,或者如果它是数字则忽略它并使用以下行:
#if isinstance(value,int):
# return '\"{}\": {}'.format(key, value)
#else:
# return '\"{}\": \"{}\"'.format(key, value)
和
#print '{}{}{}'.format('{',output_parts,'}')
但是,这并没有给我想要的结果。
期望的结果类似于:
{
{
"vol_id": "vol-0abcdab1b68111f8b",
"az": "us-west-2b",
"vol_type": "gp2",
"size": 5,
"iops": 100,
"snapshot_id":"snap-0abcdab1b68111f8b",
...,
.....,
},
{
"vol_id": "vol-0abcdab1b68111f8c",
"az": "us-west-2b",
"vol_type": "gp2",
"size": 12,
"iops": 100,
"snapshot_id": "snap-0abcdab1b68111f9c",
...,
.....
}
}
我尝试使用json.dumps(output_parts),但这无助于获得所需的输出。我不需要 CSV 输出。
【问题讨论】:
标签: python json python-2.7 csv data-conversion