python 3将ini样式文件解析为包含键/列表对的字典

时间:2019-03-13 20:37:30

标签: python python-3.x

我正在尝试解析一个主机文件,该主机文件基本上是如下所示的主机文件。

[prod]
server1
server2
server3
[uat]
server4
server5
server6

我想弄清楚的是如何以此来制作字典,其中标头为键,服务器为列表,作为字典的值部分。

{prod,[server1,server2,server3],uat[server4,server5,server6]}

我找不到或至少能够将其放入工作状态。我有点坚持下面的代码。

def file_parse(self,file):
  with open(file, 'r+') as file:
    lines = file.readlines()
  for word in filter(None, (line.rstrip('\n') for line in lines)):
    if word.startswith('['):
      print("header: {0}".format(word))
    else:
      print(word)

哪个可以正确输出,但我无法将其整理成上述字典。

当前示例输出

header: [prod]
server1
server2
server3
header: [uat]
server4
server5
server6

2 个答案:

答案 0 :(得分:0)

也许您想要类似的东西?

代码

#!/usr/bin/python3
# -*- coding: utf-8 -*-

if __name__ == '__main__':

    result = dict()
    last_word = ''

    with open('hosts', 'r+') as file:
        lines = file.readlines()
        for word in filter(None, (line.rstrip('\n') for line in lines)):
            if word.startswith('['):
                last_word = word[1:-1]
                result[last_word] = list()
            else:
                result[last_word].append(word)

print(result)

输出

  

{'prod':['server1','server2','server3'],'uat':['server4','server5','server6']}

答案 1 :(得分:0)

这很有趣。我在下面的示例中编辑了您的字符串,以添加更多

>>> string = '''[prod]
server1
server2
server3
[uat]
server4
server5
server6
[prod1]
server7
server8
server9
[uat1]
server10
server11
server11'''


>>> def return_parsed_dict(string):
        import re
        dict = {}
        parse = re.findall('(?<=\[)([\S\s]+?)(?=\])[\n\]]+([\S\s]+?)\n*(?=\[|$)', string)
        for elem in parse:
            dict.update({elem[0]:elem[1].split('\n')})
        return dict


>>> return_parsed_dict(string)
  {'prod1': ['server7', 'server8', 'server9'], 'prod': ['server1', 'server2', 'server3'], 'uat': ['server4', 'server5', 'server6'], 'uat1': ['server10', 'server11', 'server11']}

让我知道您是否想让我解释