我正在尝试使用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方法来做到这一点。
谢谢。
答案 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()