解析自定义配置文件

时间:2019-06-24 20:36:09

标签: python

您好,我们有一些自定义应用程序,其配置文件如下所示:

application{
    rules{
        a{
             role admin
             permission write
         }
    }
    config{
        settings{
            file name.txt
            parameters{
                id 1234
                hash-size 4096
            }
        }
    }
}

我只是想找出一种方法来解析此内容,并且只获取config部分,因此不需要其他所有内容。我什至不知道如何开始像这样解析文件。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

对于“快捷方式”解决方案,您可以将配置文件转换为类似于XML的文件,然后使用BeautifulSoup对其进行解析。但是如果配置文件的语法足够复杂,我会使用其他解决方案(例如,像注释中的PyParsing):

data = '''application{
    rules{
        a{
             role admin
             permission write
         }
    }
    config{
        settings{
            file name.txt
            parameters{
                id 1234
                hash-size 4096
            }
        }
    }
}'''

from bs4 import BeautifulSoup
import re

data = re.sub(r'([a-z]+)\{', r'<t data="\1">', data)
data = re.sub(r'\}', r'</t>', data)
data = re.sub(r'^[^\w]+([^\s]+)\s([a-z\d\-\.]+)\n', r'<parameter name="\1">\2</parameter>', data, flags=re.M)

soup = BeautifulSoup(data, 'lxml')

settings = soup.select_one('t[data="config"]').select_one('t[data="settings"]')
print('File: {}'.format(settings.parameter.text))
print('Parameters:')
for p in settings.select('t[data="parameters"] > parameter'):
    print('name={} value={}'.format(p['name'], p.text))

打印:

File: name.txt
Parameters:
name=id value=1234
name=hash-size value=4096

答案 1 :(得分:0)

这是构造json字符串的方法。

data = '''application{
    rules{
        a{
             role admin
             permission write
         }
    }
    config{
        settings{
            file name.txt
            parameters{
                id 1234
                hash-size 4096
            }
        }
    }
}'''


def to_dict(data):
    data_list = ['{']

    for line in data.splitlines():
        line = line.strip()

        if line.endswith('{'):
            data_list.append('"' + line.replace('{', '": {'))
        elif line == '}':
            data_list.append(line + ',')
        elif ' ' in line:
            tokens = line.split(' ')
            data_list.append('"%s": "%s",' % (tokens[0], tokens[1]))

    data_list.append('}')

    import json

    data_str = ''.join(data_list).replace('",}', '"}')

    while '},}' in data_str:
        data_str = data_str.replace('},}', '}}')

    return json.loads(data_str)


print(to_dict(data))