30 Stimmen

Iteriere über Abschnitte in einer Konfigurationsdatei

Ich wurde kürzlich mit der Bibliothek configparser eingeführt. Ich möchte überprüfen können, ob jede Sektion mindestens einen Booleschen Wert hat, der auf 1 gesetzt ist. Zum Beispiel:

[Horizontal_Random_Readout_Size]
Small_Readout  = 0
Medium_Readout = 0
Large_Readout  = 0

Dies würde einen Fehler verursachen.

[Vertical_Random_Readout_Size]
Small_Readout  = 0
Medium_Readout = 0
Large_Readout  = 1

Dies würde bestehen. Nachfolgend finden Sie etwas Pseudocode von dem, was ich im Sinn hatte:

exit_test = False
for sections in config_file:
    section_check = False
    for name in parser.options(section):
        if parser.getboolean(section, name):
            section_check = True
    if not section_check:
        print "FEHLER: Bitte geben Sie eine Einstellung im Abschnitt {} der Konfigurationsdatei an".format(section)
        exit_test = True
    if exit_test:
        exit(1)

Fragen:

1) Wie kann ich die erste Schleife durchführen und über die Sektionen der Konfigurationsdatei iterieren?

2) Ist dies eine gute Methode oder gibt es eine bessere Lösung? (Wenn nicht, beantworten Sie bitte Frage eins.)

85voto

Nilesh Punkte 19313

Mit ConfigParser müssen Sie Ihre Konfiguration parsen.

Nach dem Parsen erhalten Sie alle Abschnitte mit der Methode .sections().

Sie können über jeden Abschnitt iterieren und .items() verwenden, um alle Schlüssel/Wert-Paare jedes Abschnitts zu erhalten.

für each_section in conf.sections():
    für (each_key, each_val) in conf.items(each_section):
        print each_key
        print each_val

1voto

user3360243 Punkte 19

Der beste Weg ist, ALLE Zeilen in der Datei in irgendeiner Art von Array zu laden (ich werde das Problem ignorieren, wie viel Speicher das verwenden könnte und ob man stattdessen durchblättern sollte).

Dann wissen Sie, dass Zeilen, die Überschriften kennzeichnen, einem bestimmten Format folgen, sodass Sie über Ihr Array iterieren können, um ein Array von Objekten zu erstellen, die den Überschriftenamen, den Zeilenindex (nullbasierte Referenz zum Master-Array) und ob diese Überschrift einen Wert hat, enthalten.

Von dort aus können Sie über diese Objekte im Kreuzverweis zum Master-Array iterieren und für jede Überschrift die nächsten "n" Zeilen (im Master-Array) zwischen der aktuellen Überschrift und der nächsten überprüfen.

An diesem Punkt sind Sie bei den einzelnen Konfigurationswerten für diese Überschrift angelangt, sodass Sie die Zeile leicht parsen und einen Wert erkennen können, woraufhin Sie aus der Schleife ausbrechen können, wenn dies zutrifft, oder für mehr Robustheit eine Exklusivitätsprüfung für die Werte dieser Überschrift durchführen können, um sicherzustellen, dass NUR ein Wert festgelegt ist.

Bei Verwendung dieses Ansatzes haben Sie Zugriff auf alle Zeilen, mit einem Objekt pro Überschrift, sodass Ihr Code flexibel und funktional bleibt. Optimieren Sie danach.

Hoffentlich ergibt das Sinn und ist hilfreich.

1voto

Onyr Punkte 511

Um die Antwort von @Nilesh und den Kommentar von @PashMic zu vervollständigen, hier ist ein Beispiel, das wirklich über ALLE Abschnitte iteriert, einschließlich DEFAULT:

all_section_names: list[str] = conf.sections()
all_section_names.append("DEFAULT")
for section_name in all_section_names:
    for key, value in conf.items(section_name):
        ...

Beachten Sie, dass selbst wenn es keinen echten "DEFAULT" Abschnitt gibt, dies immer noch funktioniert. Es werden einfach keine Elemente von conf.items("DEFAULT") abgerufen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X