Ich muss die ConfigParser
verwenden können, um mehrere Werte für den gleichen Schlüssel zu lesen. Beispiel Konfigurationsdatei:Wie konfiguriere ich eine Datei mit mehreren Werten für identische Schlüssel?
[test]
foo = value1
foo = value2
xxx = yyy
Mit der ‚Standard‘ Verwendung von ConfigParser
wird es value2
ein Schlüssel foo
mit dem Wert sein. Aber ich brauche den Parser, um beide Werte zu lesen.
ein entry on duplicate key Nach mir den folgenden Beispielcode erstellt habe:
from collections import OrderedDict
from ConfigParser import RawConfigParser
class OrderedMultisetDict(OrderedDict):
def __setitem__(self, key, value):
try:
item = self.__getitem__(key)
except KeyError:
super(OrderedMultisetDict, self).__setitem__(key, value)
return
print "item: ", item, value
if isinstance(value, list):
item.extend(value)
else:
item.append(value)
super(OrderedMultisetDict, self).__setitem__(key, item)
config = RawConfigParser(dict_type = OrderedDict)
config.read(["test.cfg"])
print config.get("test", "foo")
print config.get("test", "xxx")
config2 = RawConfigParser(dict_type = OrderedMultisetDict)
config2.read(["test.cfg"])
print config2.get("test", "foo")
print config.get("test", "xxx")
Den ersten Teil (mit config
) liest in der Config uns ‚normalen‘, Datei nur value2
als Wert für foo
verlassen (Überschreiben/den anderen Wert zu löschen) und ich die folgende, erwartete Ausgabe:
value2
yyy
Der zweite Teil (config2
) verwendet mein Ansatz mehrere Werte an einen li anhängen st, aber die Ausgabe ist stattdessen
['value1', 'value2', 'value1\nvalue2']
['yyy', 'yyy']
Wie werde ich die sich wiederholenden Werte loswerden? Ich erwarte eine Ausgabe wie folgt:
['value1', 'value2']
yyy
oder
['value1', 'value2']
['yyy']
(Ich habe nichts dagegen, wenn jeder Wert in einer Liste ist ...). Irgendwelche Vorschläge willkommen.
Ich habe keine Ahnung, warum 'Super (OrderedDict, selbst)' funktioniert, aber nicht 'Super (MultiOrderedDict, selbst) '. –
Ja, perfekt! Außer der "Super" Anomalie. Vielleicht ist es * die Basisklasse von 'OrderedDict' dann ... – Alex
Gibt es eine Möglichkeit, dass ein einzelner Wert anstelle einer Liste zurückgegeben wird, wenn es nur einen Wert gibt? ['value1', 'value2'] und yyy anstelle von ['yyy'] –