【问题标题】:Generating json file from text file in Python and removing unnecessary braces从 Python 中的文本文件生成 json 文件并删除不必要的大括号
【发布时间】:2016-11-12 16:09:01
【问题描述】:

基本上我是从一个文本文件生成一个 json Terraform 文件,但我无法以正确的方式对其进行格式化:

我希望完成的 Terraform 文件如下所示:

{
  "resource": {
    "aws_route53_record": {

      "analytics": {
        "name": "analytics",
        "records": ["1.2.3.4"],
        "ttl": "1800",
        "type": "A"
      },

      "analytics-test": {
        "name": "analytics-test",
        "records": ["1.2.3.4"],
        "ttl": "300",
        "type": "A"
      }
    }
  }
}

这是 Terraform 解析 json 所需的格式。

所以我在 Python 中加载文本文件,并遍历每一行,生成一个列表列表,如下所示:

records = [["analytics", "1.2.3.4", "1800", "A"],["analytics-test", "1.2.3.4", "300", "A"]]

我现在生成文件的代码如下所示

我创建了一个包含顶级变量的 dict 占位符,如下所示:

json_object = {'resource': {'aws_route53_record': None}}

然后我查看记录并分配适当的值:

for each_list in data:
    terrarecord = {
        each_list[0]:{
            "name": each_list[0],
            "type": each_list[2],
            "ttl": each_list[1],
            "records": [each_list[3].replace('\n', '')]
        }
    }

record_holder.append(terrarecord)

record_holder 对象是一个空列表,然后我用它来填充json_objects,如下所示:

json_object['resource']['aws_route53_record'] = record_holder

这在完成的文件中给我的是:

    {
    "resource": {
        "aws_route53_record": [{
            "analytics": {
                "ttl": "1800",
                "records": ["173.194.245.129"],
                "name": "analytics",
                "type": "A"
            }
        }, {
            "analytics-test": {
                "ttl": "300",
                "records": ["130.211.89.168"],
                "name": "analytics-test",
                "type": "A"
            }
        }]
    }
}

那么如果不添加我的小循环所做的额外[]{}s,是否有更简单的方法来做到这一点?

【问题讨论】:

    标签: python json loops


    【解决方案1】:

    为什么要在需要字典时创建中间列表?

    terrarecord = {}
    for each_list in data:
        terrarecord[each_list[0]] = {
            "name": each_list[0],
            "type": each_list[2],
            "ttl": each_list[1],
            "records": [each_list[3].replace('\n', '')]
        }
    }
    
    json_object['resource']['aws_route53_record'] = terrarecord
    

    【讨论】:

    • 我的愚蠢无止境。感谢您向我指出这一点。我想我迷失在自己的代码中
    猜你喜欢
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多