Die typische von ConfigParser generierte Datei sieht folgendermaßen aus:
[Section]
bar=foo
[Section 2]
bar2= baz
Gibt es jetzt eine Möglichkeit, Listen zu indizieren, wie zum Beispiel:
[Section 3]
barList={
item1,
item2
}
Verwandte Frage: Pythons eindeutige ConfigParser-Schlüssel pro Abschnitt
python
configparser
Pistacchio
quelle
quelle
Auch etwas spät, aber vielleicht hilfreich für einige. Ich verwende eine Kombination aus ConfigParser und JSON:
Lies es einfach mit:
Sie können sogar Zeilen brechen, wenn Ihre Liste lang ist (danke @ peter-smit):
Natürlich könnte ich nur JSON verwenden, aber ich finde Konfigurationsdateien viel besser lesbar und den Abschnitt [DEFAULT] sehr praktisch.
quelle
key5 : [r"abc $x_i$", r"def $y_j$"]
. Sie erheben den Fehlerjson.decoder.JSONDecodeError: Expecting value: line 1 column 2 (char 1)
Ich komme zu spät zu dieser Party, aber ich habe dies kürzlich mit einem speziellen Abschnitt in einer Konfigurationsdatei für eine Liste implementiert:
und Verwenden
config.items( "paths" )
, um eine iterierbare Liste von Pfadelementen zu erhalten, wie folgt:Hoffe das hilft anderen Leuten diese Frage zu googeln;)
quelle
; comment
bestimmte Elemente aus der Liste entfernen können , ohne die gesamte Liste neu schreiben zu müssen.key
, da ConfigParser alle diese Schlüssel in Kleinbuchstaben konvertiertconfig = ConfigParser.SafeConfigParser()
config.optionxform = str
Dann wird der Fall in Ruhe gelassenEine Sache, die viele Leute nicht wissen, ist, dass mehrzeilige Konfigurationswerte erlaubt sind. Beispielsweise:
Der Wert von
config.get('hello','barlist')
wird jetzt sein:Was Sie leicht mit der Splitlines-Methode teilen können (vergessen Sie nicht, leere Elemente zu filtern).
Wenn wir uns ein großes Framework wie Pyramid ansehen, verwenden sie diese Technik:
Quelle
Ich selbst würde den ConfigParser vielleicht erweitern, wenn dies für Sie üblich ist:
Beachten Sie, dass bei dieser Technik einige Dinge zu beachten sind
quelle
.splitlines()
statt.split()
? Bei Verwendung des Standardverhaltens ist die Aufteilung eindeutig überlegen (filtert Leerzeilen heraus). Es sei denn, ich vermisse etwas ...Wenn Sie eine Liste buchstäblich übergeben möchten, können Sie Folgendes verwenden:
Zum Beispiel Konfiguration:
Der Code lautet:
Ausgabe:
quelle
ast.literal_eval()
im Vergleich zur Verwendung der (wohl populäreren)json.loads()
? Ich denke, letzteres bietet mehr Sicherheit, nicht wahr?Keine Erwähnung des
converters
KwargConfigParser()
in einer dieser Antworten war eher enttäuschend.Gemäß der Dokumentation können Sie ein Wörterbuch übergeben,
ConfigParser
das eineget
Methode sowohl für den Parser- als auch für den Abschnitts-Proxy hinzufügt . Also für eine Liste:example.ini
Parser-Beispiel:
Dies ist mein persönlicher Favorit, da keine Unterklassen erforderlich sind und ich mich nicht auf einen Endbenutzer verlassen muss, um JSON oder eine Liste, die von interpretiert werden kann, perfekt zu schreiben
ast.literal_eval
.quelle
Ich bin hier gelandet, um das zu konsumieren ...
Die Antwort ist, es auf dem Komma zu teilen und die Leerzeichen zu entfernen:
So erhalten Sie ein Listenergebnis:
Es beantwortet möglicherweise nicht genau die Frage des OP, ist jedoch möglicherweise die einfache Antwort, nach der einige Leute suchen.
quelle
[email protected]
! Kein Wunder, dass meine Post immer wieder abprallte! > _ <Folgendes verwende ich für Listen:
Inhalt der Konfigurationsdatei:
Code:
es funktioniert für Strings
im Falle von Zahlen
Konfigurationsinhalt:
Code:
Vielen Dank.
quelle
Eine andere Möglichkeit, die ich bevorzuge, besteht darin, die Werte einfach aufzuteilen, zum Beispiel:
Könnte wie folgt in eine Liste von Zeichenfolgen oder Ganzzahlen geladen werden:
Diese Methode verhindert, dass Sie Ihre Werte in Klammern setzen müssen, um sie als JSON zu laden.
quelle
Für die Serialisierung durch den Konfigurationsparser werden nur primitive Typen unterstützt. Ich würde JSON oder YAML für diese Art von Anforderung verwenden.
quelle
Ich hatte in der Vergangenheit das gleiche Problem. Wenn Sie komplexere Listen benötigen, sollten Sie einen eigenen Parser erstellen, indem Sie von ConfigParser erben. Dann würden Sie die get-Methode damit überschreiben:
Mit dieser Lösung können Sie auch Wörterbücher in Ihrer Konfigurationsdatei definieren.
Aber sei vorsichtig! Dies ist nicht so sicher: Dies bedeutet, dass jeder Code über Ihre Konfigurationsdatei ausführen kann. Wenn Sicherheit in Ihrem Projekt kein Problem darstellt, würde ich in Betracht ziehen, Python-Klassen direkt als Konfigurationsdateien zu verwenden. Folgendes ist viel leistungsfähiger und entbehrlicher als eine ConfigParser-Datei:
quelle
barList=item1,item2
und dann aufgerufen werdenif value.find(',') > 0: return value.split(',')
, oder noch besser, die Anwendung muss alle Konfigurationsoptionen als Listen analysieren und einfach.split(',')
alles blind?Also jetzt meine
config.cfg
Datei, die so aussehen könnte:Kann für mein kleines Projekt in feinkörnige Objekte analysiert werden.
Dies dient zum sehr schnellen Parsen einfacher Konfigurationen. Sie verlieren alle Möglichkeiten, Ints, Bools und andere Ausgabetypen abzurufen, ohne das von der zurückgegebenen Objekt zurückgegebene Objekt zu transformieren
Parser
oder den von der Parser-Klasse an anderer Stelle ausgeführten Parsing-Job erneut auszuführen.quelle
Ich habe eine ähnliche Aufgabe in meinem Projekt mit einem Abschnitt mit Schlüsseln ohne Werte abgeschlossen:
Ausgabe:
app.config:
quelle
json.loads
&ast.literal_eval
scheint zu funktionieren, aber eine einfache Liste in der Konfiguration behandelt jedes Zeichen als Byte und gibt sogar eine eckige Klammer zurück.was bedeutet, wenn config hat
fieldvalue = [1,2,3,4,5]
dann
config.read(*.cfg)
config['fieldValue'][0]
Rückkehr[
anstelle von1
quelle
Wie von Peter Smit erwähnt ( https://stackoverflow.com/a/11866695/7424596 ) Möglicherweise möchten Sie ConfigParser erweitern. Außerdem kann ein Interpolator zum automatischen Konvertieren in und aus der Liste verwendet werden.
Als Referenz finden Sie unten Code, der die Konfiguration automatisch wie folgt konvertiert:
Wenn Sie also Schlüssel anfordern, erhalten Sie:
Code:
quelle