在python中解析具有相同节名的配置文件

Exy*_*Tab 10 python configparser python-3.x

我尝试解析文件,如:

[account]
User = first

[account]
User = second
Run Code Online (Sandbox Code Playgroud)

我在Python中使用ConfigParser,但是当我读取文件时:

Config = configparser.ConfigParser()
Config.read(file)
print (Config.sections())
Run Code Online (Sandbox Code Playgroud)

我有错误:

While reading from ... : section 'account' already exists
Run Code Online (Sandbox Code Playgroud)

我该如何解析这个文件?还有其他图书馆吗?(更喜欢python3)

ale*_*xis 18

如果你想要的只是简单地合并相同名称的部分(最新的一个胜利),只需将strict=False选项传递给构造函数(在Python 3.2中添加).您可以dict.update()在合并重复部分时有效地获取行为.

Config = configparser.ConfigParser(strict=False)
Run Code Online (Sandbox Code Playgroud)

但是,从OP的样本数据中可以清楚地看出,相同名称的部分需要保持分离,以避免数据丢失.ConfigParser它将它读取的部分存储在字典中,因此它不能处理具有相同名称的多个部分.幸运的是,构造函数接受一个dict_type参数,允许您指定不同的类字典对象.您可以使用它来支持具有相同名称的部分.这是一个粗略的解决方案,通过在之前看到部分名称时附加一个唯一的数字来破坏部分名称.

from collections import OrderedDict

class multidict(OrderedDict):
    _unique = 0   # class variable

    def __setitem__(self, key, val):
        if isinstance(val, dict):
            self._unique += 1
            key += str(self._unique)
        OrderedDict.__setitem__(self, key, val)

Config = configparser.ConfigParser(defaults=None, dict_type=multidict, strict=False)
Run Code Online (Sandbox Code Playgroud)

通过一点点工作,您应该能够构建一个更清洁的解决方案.

  • Armin Ronacher 的 [`MultiDict`](https://werkzeug.palletsprojects.com/en/0.15.x/datastructs/#werkzeug.datastructs.MultiDict) 是此数据结构的一个非常简洁的实现。 (2认同)
  • 对我不起作用。读取有效,但通过 Config['SectionName'] 访问部分不再有效,即使 Config.sections() 显示部分名称。使用Python 3.8 (2认同)