Python解析一个丑陋的配置文件

时间:2016-09-12 10:21:39

标签: python parsing

我有一个应用程序生成一个奇怪的配置文件

rendererForOverlay

我正在努力解决如何在python中解析这个问题。每个应用程序的键也可能不同。 我无法更改应用程序以一些易于解析的格式生成配置文件:)

有关如何以蟒蛇方式执行此操作的任何建议吗? 我正在思考dict的词典

app_id1 {
key1 = val
key2 = val
...
}
app_id2 {
key1 = val
key2 = val
...
}
...

3 个答案:

答案 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)