Parsing configure file with same section name in python

后端 未结 4 1114
囚心锁ツ
囚心锁ツ 2020-12-30 06:44

I try to parse file like:

[account]
User = first

[account]
User = second

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



        
4条回答
  •  长发绾君心
    2020-12-30 07:00

    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.

提交回复
热议问题