Если вам нужно просто объединить разделы с одинаковыми именами (победит последний), просто передайте опцию strict=False
конструктору (добавлен в Python 3.2).Вы фактически получаете поведение dict.update()
, когда дублирующиеся разделы объединяются.
Config = configparser.ConfigParser(strict=False)
Однако из примеров данных ОП видно, что разделы с одинаковыми именами необходимо хранить отдельно, чтобы избежать потери данных.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)
Немного поработав, вы сможете создать более чистое решение.