2016-08-09 3 views
0

Ich versuche, ein Python 2.7 Skript zu schreiben, um durch eine Konfigurationsdatei zu analysieren. Die Konfigurationsdatei hat Standardeinstellungen, aber nicht alle Einstellungen sind ausgefüllt. Ich konnte die Werte für einen einzelnen Abschnitt extrahieren, aber wenn ich zusätzliche Einträge hinzufügte, schlug meine Skriptlogik fehl. Ich denke, dass ich die Attribute (RuleName, Next) in der Konfigurationsdatei verwenden könnte, um nachzudenken, aber ich kann nicht darüber nachdenken, wie dies zu erreichen ist. Im Folgenden sehen Sie, wie die Konfigurationen aussehen.Python - Parsing-Konfigurationsdatei - Flusskontrolle

Konfigurationsdatei

RuleName "Rule 1" 
    value1 = "some value" 
    value2 = "some value" 
    value3 = "some value" 
    value4 = "some value" 
Next 
RuleName = "Rule 2" 
    value1 = "some value" 
    value2 = "some value" 
    value3 = "some value" 
Next 
RuleName = "Rule 3" 
    value1 = "some value" 
    value2 = "some value" 
    value3 = "some value" 
    value4 = "some value" 
    value5 = "some value" 
Next 

ist die Logik meiner Schrift. Irgendwelche Vorschläge wären hilfreich. Dies ist mein erster Versuch, ein komplexeres Skript mit Python zu schreiben. Ich bin mir sicher, dass es raffiniertere Möglichkeiten gibt, dies zu rechtfertigen, aber ich möchte es relativ einfach halten, während ich Python lerne.

Vielen Dank!

for line in lines: 
    n = line.lstrip() 
    if n.find(rulesetting1) != -1: 
     pos = len(rulesetting1) 
     rulevalue1 = n[pos:] 
    elif n.find(rulesetting2) != -1: 
     pos = len(rulesetting2) 
     rulevalue2 = n[pos:] 
    elif n.find(rulesetting3) != -1: 
     pos = len(rulesetting3) 
     rulevalue3 = n[pos:] 
    elif n.find(rulesetting4) != -1: 
     pos = len(rulesetting4) 
     rulevalue4 = n[pos:] 
    elif n.find(rulesetting5) != -1: 
     pos = len(rulesetting5) 
     rulevalue5 = n[pos:] 
    elif n.find("Next") != -1: 
     Start cycle over? 

Was ist mit der Suche nach "Next" und dann den Zyklus zu starten. Irgendwann möchte ich das in eine CSV-Datei schreiben, aber ich muss diesen Fluss zuerst runter bekommen.

+0

Ich denke, dass Sie eine andere Variable benötigen, um den Zustand anzuzeigen, in dem Sie sich befinden. Zum Beispiel vor dem Lesen einer Zeile setzen Sie den Status auf "WAITING_RULE" ', nach" "RuleName" "Zeile lesen, setzen Sie den Status auf" " READING_RULE "'. Nachdem die Zeile "Next" gelesen wurde, setzen Sie den Status erneut zurück. Wenn Sie nur bestimmte Regeln laden möchten, überspringen Sie die Zeilen "RuleName", die Sie nicht möchten. Die Statusvariable bestimmt, ob eine "value =" value "" -Zeile übersprungen werden soll. – Cychih

Antwort

0

Das sieht für mich wie ein Wörterbuch aus.

optionsdict = dict() 

curkey = None 
for line in optionsfile: 
    if line.strip().startswith("RuleName"): 
     curkey = line.split("=")[1].strip() # whatever's after the = 
    elif line.strip() == "Next": 
     pass # not sure what you're doing with the Next lines... 
    else: 
     option, value = map(str.strip, line.split("=")) 
     optionsdict.setdefault(curkey, {})[option] = value 

Das hieß, scheint es, wie es einfacher sein würde ein Standardformat zu verwenden, die Batterien enthalten kommt, wenn Sie alle diese sowieso machen.

# configfile.ini 
[Rule 1] 
value1 = "some value" 
value2 = "some value" 
value3 = "some value" 
value4 = "some value" 
[Rule 2] 
value1 = "some value" 
value2 = "some value" 
value3 = "some value" 
value4 = "some value" 
[Rule 3] 
value1 = "some value" 
value2 = "some value" 
value3 = "some value" 
value4 = "some value" 
value5 = "some value" 

 

# Python script 

from configparser import ConfigParser 

config = ConfigParser() 
config.read_file("path/to/configfile.ini") 
config["Rule 1"]["value1"] # "some value" 

Dies verwendet die configparser Paket Ihre Optionen zu analysieren.

+0

Configparser states "Die Konfigurationsdatei besteht aus Abschnitten, die von einem [section] -Header gefolgt von name: value-Einträgen gefolgt werden, wobei meine Konfigurationsdatei nicht unbedingt diesem Format folgt. Ist es möglich, dass Schleifen in einer anderen Schleife durchlaufen werden und Linienwerte wie "edit" und "next" als Trennzeichen dafür verwendet werden, wann die Iteration gestartet und gestoppt werden soll? Ich möchte alle Daten erfassen, die möglicherweise alle zugehörigen Werte enthalten. – user2565554

+0

Ich sehe nichts davon in Ihrem Beispiel. Können Sie mir eine Beispielkonfigurationsdatei geben? –

+0

Bitte beachten Sie den Abschnitt namens Konfigurationsdatei. Grundsätzlich wird jeder Abschnitt durch RuleName und Next begrenzt. Die Details der Regel liegen zwischen diesen beiden Begrenzern. Ich habe ungefähr 50 Regeln, die ich durchlaufen muss. – user2565554