我有一个应用程序生成一个奇怪的配置文件
rendererForOverlay
我正在努力解决如何在python中解析这个问题。每个应用程序的键也可能不同。 我无法更改应用程序以一些易于解析的格式生成配置文件:)
有关如何以蟒蛇方式执行此操作的任何建议吗? 我正在思考dict的词典
app_id1 {
key1 = val
key2 = val
...
}
app_id2 {
key1 = val
key2 = val
...
}
...
答案 0 :(得分:2)
尝试这样的事情:
我假设您将文件的内容读取为字符串
config_file_string = '''app_id1 {
key1 = val
key2 = val
key3 = val
}
app_id2 {
key1 = val
key2 = val
}'''
config = {}
appid = ''
for line in config_file_string.splitlines():
print(line)
if line.endswith('{'):
appid = line.split()[0].strip()
placeholder_dict = {}
elif line.startswith('}'):
config[appid] = placeholder_dict
else:
placeholder_dict[line.split('=')[0].strip()] = line.split('=')[1].strip()
print(config)
返回:
{'app_id2': {'key2 ': ' val', 'key1 ': ' val'}, 'app_id1': {'key3 ': ' val', 'key2 ': ' val', 'key1 ': ' val'}}
答案 1 :(得分:2)
您可以使用正则表达式:(\w+)\s*\{([^}]*)
会找到name { values }
构造,而([^\s=]+)\s*=\s*([^\n]*)
会找到key = value
对。
作为一个单行,假设文件的内容在变量s
中:
config= {key:dict(re.findall(r'([^\s=]+)\s*=\s*([^\n]*)', values)) for key,values in re.findall(r'(\w+)\s*\{([^}]*)', s)}
答案 2 :(得分:2)
您可以将pyparsing用于不太严格的语法:
from pyparsing import alphanums, restOfLine, OneOrMore, Word, Suppress
from copy import copy
lbrace,rbrace,eq = map(Suppress,"{}=")
configitem = {}
configall = {}
wd = Word(alphanums+'_')
kw = wd + eq + restOfLine
kw.setParseAction(lambda x: configitem.__setitem__(x[0],x[1].strip()))
group = wd + lbrace + OneOrMore(kw) + rbrace
group.addParseAction(lambda x: configall.__setitem__(x[0],copy(configitem)))
group.addParseAction(lambda x: configitem.clear())
config = OneOrMore(group)
config_file_string = '''app_id1
{
key1 = val
key2 = val
key3 = val
}
app_id2 {
key1 = val
key2 = val
}'''
config.parseString(config_file_string)
print(configall)