从python列表创建JSON数组

从python列表创建JSON数组,python,arrays,json,ansible,Python,Arrays,Json,Ansible,我目前正在尝试编写一些东西,将Ansible清单文件转换为JSON数组,这样可以将其拉入awx/tower,但是我一直在努力从当前清单文件格式构建一个全新的数组。我避免使用任何Ansible python API模块,因为不能保证将来的更新不会破坏这些模块。我发现的一个解决方案不再有效,因为Ansible InventoryParser python模块似乎发生了更改,所以我尝试提出一个python 2.7解决方案 示例库存文件 [test] host1 host2 [test1] host3

我目前正在尝试编写一些东西,将Ansible清单文件转换为JSON数组,这样可以将其拉入awx/tower,但是我一直在努力从当前清单文件格式构建一个全新的数组。我避免使用任何Ansible 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)
不幸的是,这将返回错误: ValueError:字典更新序列元素#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": {}
  }    
}
这可能对你有帮助

import json
both = {}
start = '['
end = ']'
with open(filename, "r") as f:
    line = f.readline().strip()
    while line:
        if start in line or end in line:
           line = line.split(start)[1].split(end)[0]
        both[line] = line
        line = f.readline().strip()
json_dict = {'all': [both]}

print(json.dumps(json_dict))

我是否正确理解您的意思,您想要获得
['host1'、'host2'、'host3'、'host4']
?您想要的实际输出是什么?您正在将字符串的iterable传递给
dict()
,这需要长度为2的iterable。此外,这似乎是一个问题。我已经用我试图实现的预期输出更新了问题。