ConfigParser python中的重复键

时间:2015-05-07 08:16:57

标签: python

我正在尝试使用configparser从一个部分中提取选项的重复值。我搜索并尝试了here提供的解决方案。有了这个,我能够提取选项部分的重复键的值。但是当我尝试使用函数configparser.items()提取名称:值对时,我没有得到任何值。



[server]
unix-user = ivmgr
root = 1
root = 2
root = 3






class MultiOrderedDict(OrderedDict):
    def __setitem__(self, key, value):
        if isinstance(value, list) and key in self:
            self[key].extend(value)
        else:
            super(OrderedDict, self).__setitem__(key, value)

config = ConfigParser.RawConfigParser(dict_type=MultiOrderedDict)
config.read(['1.conf'])
print config.get("server",  "unix-user")
print config.get("server",  "root")
['ivmgr']
['1', '2', '3']
>>> print config.items("server")
[]




我希望能够提取名称:值对作为词典或元组,例如{' root':' 1',' root': ' 2',' root':' 3' }。我正在使用python 2.7。 我知道我可以使用root创建一个dict或集合列表作为所有的键,但我可能在同一部分中有更多的重复键,我想要一个pythonic方法来做到这一点。

谢谢。

2 个答案:

答案 0 :(得分:0)

无法在字典中获取结果,因为您的密钥始终是' root'它将取代之前的值。您可以使用简单的技巧而不是强制更改ConfigParser的默认功能:

results = [('root', v) for v in config.get("server",  "root")]

但是,也许最好更改设置。我不知道为什么你没有将元组设置为&root;' root'在您的设置文件中:

[server]
unix-user = ivmgr
root = (1, 2, 3)

这对我有用。

import ConfigParser
class M(dict):
    def __setitem__(self, key, value):
        if key in self:
            items = self[key]
            new = value[0]
            if new not in items:
                items.append(new)
        else:
            super(M, self).__setitem__(key, value)
cp = ConfigParser.ConfigParser(dict_type=M)
cp.read('x.settings')
print cp.get('server', 'root')
results = [('root', v) for v in cp.get("server",  "root")]
print results

答案 1 :(得分:0)

在Python 3.6.0中,dict类型提供的key方法可以使方法部分正常工作。目前我不知道为什么需要重新定义。 MultiOrderedDict看起来像是:

class MultiOrderedDict(OrderedDict):
    def __setitem__(self, key, value):
        if isinstance(value, list) and key in self:
            self[key].extend(value)
        else:
            super(OrderedDict, self).__setitem__(key, value)
    def keys(self):
        return super(OrderedDict, self).keys()