从python lis创建JSON数组

2024-06-12 08:50:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试编写一些东西来将Ansible库存文件转换为JSON数组,这样就可以将其拉入awx/tower,但是我一直在努力从当前库存文件格式构建一个全新的数组。我避免使用任何可移植的python API模块,因为不能保证将来的更新不会破坏这些模块。我发现的一个解决方案已经不起作用了,因为Ansible InventoryParser python模块似乎发生了变化,所以我试图提出一个python 2.7解决方案。

库存文件示例

[test]
host1
host2
[test1]
host3
host4

[]表示组,其他条目是将成为键:值关系的主机。我已经在python中将其转换为一个列表,然后尝试将其格式化为key:value设置,使用[]作为从值中拆分键的位置。

both = []
f = open(filename, "r")
line = f.readline().strip()
while line:
    both.append(line)
    line = f.readline().strip()
f.close()

start = '['
end = ']'
json_dict = {'all': [dict(item.split(start)[1].split(end)[0] for item in 
both)]}

print json.dumps(json_dict)

很遗憾,这将返回错误: 值错误:字典更新序列元素0的长度为4;需要2

尽管实话实说,但我不确定这是否会回报我正在寻找的东西。

希望有人能给我指出正确的方向,或者指出我到目前为止做错了什么。

干杯

编辑:为实际需要的输出添加一些代码

{
[test]: {
    'hosts': ['host1', 'host2'],
    },
[test1]: {
    'hosts': ['host3', 'host4'],
    }
} 

一个更详细的输出示例,说明我正在努力实现的目标

{
    "databases"   : {
        "hosts"   : [ "host1.example.com", "host2.example.com" ],
        "vars"    : {
            "a"   : true
        }
    },
    "webservers"  : [ "host2.example.com", "host3.example.com" ],
    "atlanta"     : {
        "hosts"   : [ "host1.example.com", "host4.example.com", 
"host5.example.com" ],
        "vars"    : {
            "b"   : false
        },
    },
    "marietta"    : [ "host6.example.com" ],
    "5points"     : [ "host7.example.com" ]
}

所以我们有一个保存组名的键,其中有主机和变量的键:值对。

经过更多的研究,我更接近我的输出与以下代码的愿望

both = {}
group = None

with open(filename, "r") as f:
    line = f.readline().strip()
    while line:
        if line.startswith('#') or line.startswith(';') or len(line) == 0:
            continue

        if line.startswith("["):
            # is a group
            group = line
            both[group] = {}
        elif not line.startswith("["):
            host = line
            both[group][host] = {}
        line = f.readline().strip()
f.close()

return both

它返回了下面的内容,虽然不是我想要的,但我觉得我在进步

{
  "[test2]": {
    "host1": {}, 
    "host2": {}
  }, 
  "[test3]": {
    "host3": {}
  }, 
  "[test]": {
    "host4": {}, 
    "host5": {}
  }    
}

Tags: 模块comreadlineexample库存linegroupstrip