Analyse konfigurieren Sie die Datei mit dem gleichen Namen für den Abschnitt ein, in python
Ich versuche zu analysieren-Datei wie:
[account]
User = first
[account]
User = second
Benutze ich ConfigParser von Python, aber wenn ich lese Datei:
Config = configparser.ConfigParser()
Config.read(file)
print (Config.sections())
Habe ich Fehler:
While reading from ... : section 'account' already exists
Wie kann ich diese Datei analysieren? Irgendwelche anderen Bibliothek? (lieber für Python ist3)
- Sie haben die Kontrolle über die config-Datei-format? Wenn ja, ändern Sie ihn auf etwas
configparser
mag besser. - Ich kann das nicht ändern-Datei-format.
- Ich würde vorschlagen, Sie schreiben Ihre eigenen parser dafür.
- Eine einfache pre-Prozessor tun würde. Aber die perfekte Antwort gegeben wurde, unten von alexis.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn das, was Sie wollen, ist zu einfach Zusammenführen von identisch benannten Abschnitte (Letzte gewinnt), übergeben Sie einfach die
strict=False
option dem Konstruktor (Hinzugefügt in Python 3.2).Sie effektiv erhalten
dict.update()
Verhalten wie die doppelten Abschnitte zusammengefasst.Jedoch, es ist klar von der OP-sample-Daten, die die gleichnamigen Abschnitte müssen getrennt werden, um Datenverlust zu vermeiden.
ConfigParser
speichert die Abschnitte liest es in einem Wörterbuch, so dass es nicht verarbeiten kann mehrere Abschnitte mit dem gleichen Namen. Glücklicherweise ist der Konstruktor akzeptiert einedict_type
argument, dass Sie angeben können, einem anderen dictionary-ähnliches Objekt. Sie können zur Unterstützung der gleichnamigen Abschnitten. Hier ist eine rohe Lösung, die verstümmelt das section-Namen und hängt eine eindeutige Zahl, wenn ein Abschnitt name wurde zuvor gesehen.Mit etwas Arbeit, sollten Sie in der Lage sein, zu konstruieren, eine saubere Lösung.
MultiDict
.configparser
(ich habe es nicht ausprobiert), aber es würde erfordern, installieren alle Kolben/Werkzeug mit einer Abhängigkeit nur, um die MultiDict Klasse.Auf dem neuesten python gibt es eine option, die können tun, was Sie wollen :
ConfigParser(strict=True)
Cf : https://docs.python.org/3/library/configparser.html#configparser.ConfigParser
strict=True
ist die Standardeinstellung. Die EinstellungFalse
ermöglicht, dass mehrere Abschnitte mit demselben Namen, aber einfach führt Ihre Optionen.Leider, das format der mitgelieferten ini-Datei ist nicht korrekt nach standards. Ein Abschnitt der name muss eindeutig im Dokument.
Wenn Sie ändern, können Sie die Datei-format (ich habe bereits gelesen, dass Sie das nicht können, aber der Vollständigkeit halber...), dann eine Lösung wie dies angemessen wäre:
Wenn Sie können nicht wirklich die Alternative-Datei-format, dann habe ich Angst, dass Ihre einzige option ist zu analysieren, manuell in der Konfigurationsdatei.
"
Wenn Sie eine Abweichung von einem RFC-standard und erstellen Sie Ihre eigenen config-format, die Sie gehen zu müssen, um schreiben Sie Ihre eigenen parser." Diese http://www.tek-tips.com/viewthread.cfm?qid=1110829 für mich gearbeitet. Ich habe ein paar kleine änderungen. ** Formatierung kam nicht richtig, wenn geschrieben