为真正冗长的问题道歉。
我正在尝试读取配置文件并获取规则列表。我曾尝试使用 ConfigParser 来执行此操作,但它不是标准配置文件。该文件不包含节标题和令牌。
IE
config section a
将某事设置为其他
config subsection a
将此设置为
下一个
结束配置防火墙策略
编辑 76
设置 srcintf “那里”
设置 dstintf “这里”
设置 srcaddr “全部”
设置 dstaddr “全部”
设置操作接受
设置计划 “总是”
设置服务 “TCP_5600”
下一个
编辑 77
设置 srcintf “这里”
设置 dstintf “那里"
set srcaddr "all"
set dstaddr "all"
set action accept
set schedule "always"
set service "PING"
next
end
由于我不知道如何让 ConfigParser 工作,我想我会尝试遍历文件,不幸的是我没有太多的编程技能,所以我被卡住了。我真的认为我让这变得比它应该的更复杂。这是我写的代码;
class Parser(object):
def __init__(self):
self.config_section = ""
self.config_header = ""
self.section_list = []
self.header_list = []
def parse_config(self, fields): # Create a new section
new_list = []
self.config_section = " ".join(fields)
new_list.append(self.config_section)
if self.section_list: # Create a sub section
self.section_list[-1].append(new_list)
else: self.section_list.append(new_list)
def parse_edit(self, line): # Create a new header
self.config_header = line[0]
self.header_list.append(self.config_header)
self.section_list[-1].append(self.header_list)
def parse_set(self, line): # Key and values
key_value = {}
key = line[0]
values = line[1:]
key_value[key] = values
if self.header_list:
self.header_list.append(key_value)
else: self.section_list[-1].append(key_value)
def parse_next(self, line): # Close the header
self.config_header = []
def parse_end(self, line): # Close the section
self.config_section = []
def parse_file(self, path):
with open(path) as f:
for line in f:
# Clean up the fields and remove unused lines.
fields = line.replace('"', '').strip().split(" ")
if fields[0] == "set":
pass
elif fields[0] == "end":
pass
elif fields[0] == "edit":
pass
elif fields[0] == "config":
pass
elif fields[0] == "next":
pass
else: continue
# fetch and call method.
method = fields[0]
parse_method = "parse_" + method
getattr(Parser, parse_method)(self, fields[1:])
return self.section_list
config = Parser().parse_file('test_config.txt')
print config
我正在寻找的输出类似于以下内容;
[['section a', {'something': 'to something else'}, ['subsection a', {'this': 'to that'}]],['firewall policy',['76',{ 'srcintf':'那里'}, {'dstintf':'这里'}{etc.}{etc.}]]]
这就是我得到的
[['a 节']]
编辑
我已经更改了上述内容以反映我目前所处的位置。我仍然无法获得我期望的输出。我似乎无法正确列出清单。