使用具有多个具有相同名称的变量的Python解析配置文件

时间:2015-09-19 12:04:15

标签: python-3.x config configparser configobj

有没有办法用Python3解析这样的配置文件?

path = .MyAppData
prefer = newer
path = Dokumente

请不要怪我。 ;)我没有构建生成这样的配置文件的软件。但是在这种特殊背景下它们才有意义。

我知道Python3的ConfigParserconfigobj但是没有办法做到这一点。

1 个答案:

答案 0 :(得分:2)

ConfigParser初始化程序支持strict=False参数,该参数允许重复。但据我所知,文档中没有提到在这种情况下保留的值。

一个简单的解决方案是自己将这些行转换为字典;

In [1]: txt = '''path = .MyAppData
   ...: prefer = newer
   ...: path = Dokumente'''

In [2]: txt.splitlines()
Out[2]: ['path = .MyAppData', 'prefer = newer', 'path = Dokumente']

(在分割行中的文本后,您可能希望过滤掉注释和空行。)

In [3]: [ln.split('=') for ln in txt.splitlines()]
Out[3]: [['path ', ' .MyAppData'], ['prefer ', ' newer'], ['path ', ' Dokumente']]

In [4]: vars = [ln.split('=') for ln in txt.splitlines()]

(此时您可能希望为内部列表添加一个过滤器,以便您只有长度为2的列表,表示成功分割。)

In [5]: {a.strip(): b.strip() for a, b in vars}
Out[5]: {'path': 'Dokumente', 'prefer': 'newer'}

在词典理解中(在[5]中),后面的作业将覆盖之前的作业。

当然,如果prefer = older,你必须在字典理解之前反转这些行。