2014-02-27 8 views
11

Ich bin vor kurzem in die Bibliothek configparser eingeführt. Ich würde prüfen, ob jeder Abschnitt mindestens einen booleschen Wert auf eins gesetzt hat. Zum Beispiel ...Iterate über Abschnitte in einer Konfigurationsdatei

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

Das oben genannte würde einen Fehler verursachen.

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

Das obige würde bestehen. Nachfolgend finden Sie einige Pseudo-Code 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 "ERROR:Please specify a setting in {} section of the config file".format(section) 
     exit_test = True 
    if exit_test: 
     exit(1) 

Fragen:

1) Wie führe ich die erste for-Schleife und die Abschnitte der Konfigurationsdatei durchlaufen?

2) Ist das ein guter Weg dies zu tun oder gibt es einen besseren Weg? (Wenn nicht, bitte Frage 1 beantworten.)

Antwort

35

Mit ConfigParser müssen Sie Ihre Konfiguration analysieren.

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

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

for each_section in conf.sections(): 
    for (each_key, each_val) in conf.items(each_section): 
     print each_key 
     print each_val 
1

Am besten ist es, alle Zeilen in der Datei in eine Art Array zu laden (ich werde das Problem ignorieren, wie viel Speicher verwendet werden könnte und ob stattdessen durchblättern).

Dann wissen Sie, dass Zeilen, die Überschriften bezeichnen, einem bestimmten Format folgen, so dass Sie über Ihr Array iterieren können, um ein Array von Objekten zu erstellen, die den Überschriftennamen enthalten; der Zeilenindex (nullbasierter Verweis auf das Master-Array) und ob diese Überschrift einen Wert gesetzt hat.

Von dort können Sie über diese Objekte in Querverweis auf das 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 zu den einzelnen Config-Werten für diese Überschrift, so dass Sie leicht in der Lage sein sollten, die Linie zu analysieren und einen Wert zu erkennen, worauf Sie aus der Schleife brechen können, wenn wahr, oder für mehr Robustheit ausstellen Exklusivitätsprüfung der Werte dieser Überschrift, um sicherzustellen, dass NUR ein Wert gesetzt ist.

Mit diesem Ansatz haben Sie Zugriff auf alle Linien mit einem Objekt pro Überschrift, so dass Ihr Code flexibel und funktionsfähig bleibt. Danach optimieren.

Hoffnung, die Sinn macht und hilfreich ist.

+0

Sorry, habe das jetzt getan. – user3360243

+0

Beachten Sie, dass Python über eine dedizierte Bibliothek verfügt, um das Format dieser Konfigurationsdatei zu analysieren (die alles in einer Struktur im Speicher enthält). Danach ist es einfach ein Problem, welche API-Aufrufe zu verwenden sind. –