Parsing configure file with same section name in python

ExyTab picture ExyTab · Mar 26, 2012 · Viewed 12.9k times · Source

I try to parse file like:

[account]
User = first

[account]
User = second

I use ConfigParser in Python, but when i read file:

Config = configparser.ConfigParser()
Config.read(file)
print (Config.sections())

I have error:

While reading from ... : section 'account' already exists

How can i parse this file? Are any another library? (prefer for python3)

Answer

alexis picture alexis · Mar 27, 2012

If what you want is to simply merge identically named sections (latest one wins), simply pass the strict=False option to the constructor (added in Python 3.2). You effectively get dict.update() behavior as the duplicate sections are merged in.

Config = configparser.ConfigParser(strict=False)

However, it's clear from the OP's sample data that identically named sections need to be kept separate, to avoid loss of data. ConfigParser stores the sections it reads in a dictionary, so it can't handle multiple sections with the same name. Fortunately the constructor accepts a dict_type argument that allows you to specify a different dictionary-like object. You can use that to support identically named sections. Here's a crude solution that mangles the section names by appending a unique number whenever a section name has been seen before.

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)

With a little work you should be able to construct a cleaner solution.