【问题标题】:Generate JSON output instead of key=value CSV生成 JSON 输出而不是 key=value CSV
【发布时间】: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


    【解决方案1】:

    要将您的csv 行转换为dict,可以这样做:

    代码:

    def my_csv_to_dict(csv_line):
        return dict(csv.split('=') for csv in csv_line.split(','))
    

    测试代码:

    要将这些字典转换为 json,您可以使用 json 库。

    test_data = [x.strip() for x in """
        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
    """.split('\n')[1:-1]]
    
    import json
    print(json.dumps([my_csv_to_dict(x) for x in test_data], indent=2))
    

    结果:

    [
      {
        "az": "us-west-2b", 
        "autoscale": "true", 
        "Name": "[customer-2b-app41] primary", 
        "mirror": "primary", 
        "cluster": "customer", 
        "state": "0", 
        "iops": "100", 
        "role": "app", 
        "vol_type": "gp2", 
        "snapshot_id": "snap-0abcdab1b68111f8b", 
        "vol_id": "vol-0abcdab1b68111f8b", 
        "vol_state": "0", 
        "hostname": "customer-2b-app41-i-0abcdab1b68111f8b", 
        "size": "5"
      }, 
      {
        "az": "us-west-2b", 
        "state": "0", 
        "iops": "100", 
        "vol_type": "gp2", 
        "snapshot_id": "snap-0abcdab1b68111f9c", 
        "vol_id": "vol-0abcdab1b68111f8c", 
        "vol_state": "0", 
        "size": "12"
      }
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 2020-05-10
      • 2017-12-04
      • 1970-01-01
      • 2021-12-09
      相关资源
      最近更新 更多