我正在尝试解析一个主机文件,该主机文件基本上是如下所示的主机文件。
[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
答案 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']}
让我知道您是否想让我解释