为这个拖了很久的问题道歉。
我正在尝试读入一个配置文件,并获取一个规则列表。我曾尝试使用ConfigParser来做这件事,但它不是一个标准的配置文件。该文件不包含节头和标记。
即
配置部分a
将某物设置为另一物
配置小节a
将这个设置为那个
下一步
结束配置防火墙策略
编辑76
设置srcintf "There“
将dstintf设置为"Here“
set srcaddr "all“set dstaddr "all”set action accept set schedule "always“
设置服务"TCP_5600“
下一步
编辑77
将srcintf设置为"here“
设置dstintf "there“
将srcaddr设置为"all“
将dstaddr设置为"all“
设置操作accept
将计划设置为“始终”
设置服务"PING“
下一端
因为我不知道如何让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
我正在寻找的输出类似于以下内容;
[[‘节a',{’东西‘:’到其他东西‘},’子节a',{‘这个’:‘到那个’}],[‘防火墙策略’,'76',{‘srcintf’:‘那里’},{‘dstintf’:‘此处’}{等}{等}]]
这就是我得到的
[‘a节’]
编辑
我已经更改了上面的内容,以反映我目前所处的位置。我仍然在获取我期望的输出时遇到问题。我就是不能把单子写对。
发布于 2011-09-26 16:46:02
class Parser(object):
def __init__(self):
self.my_section = 0
self.flag_section = False
# ...
def parse_config(self, fields):
self.my_section += 1
# go on with fields
# ...
self.flag_section = True
def parse_edit(self, line):
...
def parse_set(self, line):
...
def parse_end(self, line):
...
def parse_file(self, path):
with open(path) as f:
for line in f:
fields = f.strip().split(" ")
method = fields[0]
# fetch and call method
getattr(Parser, "parse_" + method)(self, fields[1:])
发布于 2013-03-13 16:02:12
我将我的答案发布给那些在尝试解析Fortigate配置文件时首先从Google来到这里的人!我根据自己的需要重写了我在这里找到的东西,它工作得很好。
from collections import defaultdict
from pprint import pprint
import sys
f = lambda: defaultdict(f)
def getFromDict(dataDict, mapList):
return reduce(lambda d, k: d[k], mapList, dataDict)
def setInDict(dataDict, mapList, value):
getFromDict(dataDict, mapList[:-1])[mapList[-1]] = value
class Parser(object):
def __init__(self):
self.config_header = []
self.section_dict = defaultdict(f)
def parse_config(self, fields): # Create a new section
self.config_header.append(" ".join(fields))
def parse_edit(self, line): # Create a new header
self.config_header.append(line[0])
def parse_set(self, line): # Key and values
key = line[0]
values = " ".join(line[1:])
headers= self.config_header+[key]
setInDict(self.section_dict,headers,values)
def parse_next(self, line): # Close the header
self.config_header.pop()
def parse_end(self, line): # Close the section
self.config_header.pop()
def parse_file(self, path):
with open(path) as f:
gen_lines = (line.rstrip() for line in f if line.strip())
for line in gen_lines:
# pprint(dict(self.section_dict))
# Clean up the fields and remove unused lines.
fields = line.replace('"', '').strip().split(" ")
valid_fields= ["set","end","edit","config","next"]
if fields[0] in valid_fields:
method = fields[0]
# fetch and call method
getattr(Parser, "parse_" + method)(self, fields[1:])
return self.section_dict
config = Parser().parse_file('FGT02_20130308.conf')
print config["system admin"]["admin"]["dashboard-tabs"]["1"]["name"]
print config["firewall address"]["ftp.fr.debian.org"]["type"]
发布于 2011-09-26 16:48:58
我不知道这是否也能帮助你,但它确实对我有帮助:http://wiki.python.org/moin/ConfigParserExamples
祝你玩得开心!
https://stackoverflow.com/questions/7552364
复制相似问题