Frage zu dateien lesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

So ein paar Print-Anweisungen könnten dir beim Debuggen helfen, damit du siehst wo was wirklich passiert.
Du stripst nur Leerzeichen weg. Warum? Das steht so auch nicht in dem Beispiel von EyDu. Dadurch bleiben aber ander Whitespaces drin. Eine Zeile endet mit \n, dann kannst du nicht mehr darauf testen ob eine Zeile mit } endet.
strip(), Danach sollte es funktionieren.

Und

Code: Alles auswählen

with open("/home/tweber/status.dat") as statuspart:
sollte

Code: Alles auswählen

sein with open(status) as statuspart:
sein.
Tobbel
User
Beiträge: 14
Registriert: Freitag 7. September 2012, 11:00

Super , vielen vielen Dank! Das hat es gebracht! Ich hatte halt "open" immer in Verwendung mit spezifischem Pfad oder Dateinamen gelesen/gesehen, aber nachdem das geändert war hat es funktioniert!

und das mit dem strip(" ") hatte ich irgendwo aufgeschnappt und ausprobiert, dass das, nun wo du es sagst, natürlich nicht alles stripped hab ich nun auch verstanden. Danke nocheinmal :)

Jedoch bekomme ich keines der erwünschten Ergebnisse, könnte das in Zusammnhang mit

Code: Alles auswählen

 servicestatus["plugin_output"] = value 
servicestatus["problem_has_been_acknowledged"] = value 
servicestatus["scheduled_downtime_depth"] = value 
anstatt

Code: Alles auswählen

 servicestatus[name] = value
zusammenhängen? Oder eher an Fehlern die sich woanders im Code verstecken?

Gruß Tobi
Zuletzt geändert von Tobbel am Montag 10. September 2012, 12:34, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Gibt es eigentlich noch andere Blöcke die in der Datei stehen können?

servicestatus { leitet gerade genauso einen neuen Servicestatus ein wie weißwurstgrütze {. Unter Umständen könnte es robuster sein, nicht nur auf eine abschließende { in einer Zeile zu schauen, sondern die ganze Zeile zu vergleichen. Ggf. muss man dann auch über ein Flag festhalten ob man sich gerade in dem korrekten Block befindet und ansonsten das schließende } ignorieren. //Edit: Das mit dem Flag ist natürlich Blödsinn, dafür kann man hier ja servicestatus verwenden, das dann nur in einem Block nicht None ist.

Aber wenn das nicht vorkommen kann, ist alles gut.
Tobbel
User
Beiträge: 14
Registriert: Freitag 7. September 2012, 11:00

Ja es gibt andere, die sind nur z.B. Hoststatus o.ä genannt ,jedoch ist der inhalt identisch und soll auch ausgewertet werden, daher ist das in diesem fall sogar gut :)

Habe eben noch meinen Beitrag von zuvor editiert, evtl weis jemand noch etwas darüber :)
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Was glaubst du denn was die Zuweisungen dort machen?
Du setzt bei jeder Zeile deren Wert für drei verschiedene Schlüssel im Dictionary. Bei jeder Zeile. Egal welche kommt.
Der Code von EyDu hat hingegen für jede Zeile ein Schlüssel-Wert-Paar im Dictionary angelegt, über das man später sehr einfach an den Inhalt kommt.
BlackJack

@Tobbel: Natürlich liegt es daran. Spiel das doch mal im Kopf oder auf einem Blatt Papier Schritt für Schritt für einen Abschnitt durch. Dann sollte sehr schnell klar werden warum das so nicht funktionieren kann.
Tobbel
User
Beiträge: 14
Registriert: Freitag 7. September 2012, 11:00

Dann hatte ich das doch leider richtig verstanden was EyDu meinte, jedoch verstehe ich dann nicht ob/was ich noch anders eintragen muss an den gegebenen stellen , also an

Code: Alles auswählen

servicestatus[name] = value

sodass es mir in der späteren Abfrage nach "plugin_output" ,nicht wie jetzt einen KeyError ausgibt, ihm fehlt ja dann hier die Zuweisung...
Muss hier zuvor noch irgendwas als globale variable o.ä. definiert werden?

Steh grad ein wenig aufm schlauch was das angeht...

hier noch die Fehlermeldung

Code: Alles auswählen

  File "lampe2.py", line 106, in <module>
    Main(sys.argv[1:])
  File "lampe2.py", line 97, in Main
    if ("OK" in servicestatus["plugin_output"] and 
KeyError: 'plugin_output'
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Zeig die entsprechende Codestelle bitte und schreib mal hinter jede Zeile als Kommentar (print "hallo" # schreibt hallo) was du denkst was sie tut. Und zwar die komplette Schleife, nicht nur die drei Zeilen der Zuweisung. Es scheint mir, dass du noch nicht so ganz verstanden hast, was dieses ganze yield-Gedöns macht. Das können wir nur schnell erledigen, wenn du sagst was du meinst, das es ist.
Tobbel
User
Beiträge: 14
Registriert: Freitag 7. September 2012, 11:00

Code: Alles auswählen

def auslesen(status2):
        with open(status2) as statuspart:
                servicestatus = None  					#weist der variablen servicestatus den Wert None zu
                for line in (l.strip() for l in statuspart):		#"räumt" zeile für zeile auf
                        if line.endswith("{"): 		#untersucht ob die jeweilige Zeile mit einer { endet
                                servicestatus = {}			#falls obriges zutrifft wird servicestatus ein leeres dictionary zugewiesen
				print "test1"

                        elif line.startswith("}", 0, len(line)): 	#sucht nach dem schließ-punkt für das dictionary und gibt mit yield den generator weiter der dann... 
                                yield servicestatus
                                servicestatus = None
				print "test2"
                        
                        elif servicestatus is not None and line:	# ...hier das Dictionary befüllt haben sollte um dann später...
                                name, value = line.split("=", 1)
				servicestatus[name]  = value		# <-- sollte aus allen ausgelesen zeilen eine art "tupel" machen der durch das = getrennt ist
				print "test3"
                        
def Main(argv):
        print "Sollte angezeigt werden..."
        for servicestatus in auslesen("/home/tweber/status2.dat"):	#...und zwar hier, geladen zu werden
                print "das hier auch..."
                if ("OK" in servicestatus["plugin_output"] and		# um hier nach den parametern abgesucht werden zu können
                servicestatus["problem_has_been_acknowledged"] == "0" and
                servicestatus["scheduled_downtime_depth"] == "0"):
                        print "wuhu"
                else:
                        print "meh..."                  
                        

if __name__ == "__main__":
    Main(sys.argv[1:])	
So das sollte es sein, ich hoff man verzeiht mir das ich noch ein beginner in python bin... :)

Wenn jemand im Ruam Freiburg wohnt, darf er sich auf ein Bier eingeladen fühlen ;)

Edit: bekomme mit diesem Code nun den fehler:

Code: Alles auswählen

tweber@buero01:~$ python lampe2.py 
Sollte angezeigt werden...
das hier auch...
Traceback (most recent call last):
  File "lampe2.py", line 110, in <module>
    Main(sys.argv[1:])			
  File "lampe2.py", line 101, in Main
    if (servicestatus["plugin_output"].startswith("OK", 5, len(servicestatus["plugin_output"])) and		
TypeError: 'NoneType' object is not subscriptable
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Ich würde (vorsichtshalber) folgende Änderung vornehmen:

Code: Alles auswählen

elif line.startswith("}", 0, len(line)):
zu

Code: Alles auswählen

elif line.startswith("}", 0, len(line)) and servicestatus:
Wenn servicestatus none ist, ist die Bedingung nicht erfüllt, dann wird kein None-Objekt zurück gegeben.

Ansonsten funktioniert dein Code hier wunderbar. Das Problem, dass du jetzt nur auf hoststatus { geprüft hast, hast du ja selbst gefunden und korrigiert.
Tobbel
User
Beiträge: 14
Registriert: Freitag 7. September 2012, 11:00

Ich versteh zwar nicht ganz warum das jetzt richtig funktioniert, aber seit das "and servicestatus" als Bedingung dabei steht gibt er keinen fehler mehr aus... es wurde doch lediglich die Menge der "gesplitteten" spalten verringert...

Naja es funktioniert nun! Vielen Dank an alle die sich die Mühe gemacht haben!

Und wie gesagt, Raum Freiburg --> Pn --> Gratis-getränk nach wahl :)

Gruß Tobi
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Wenn vorher ein } in der Datei stand, hat er automatisch servicestatus "zurückgegeben", auch wennd das noch None war, weil nämlich gar kein { vorbei gekommen ist.
Wenn servicestatus None ist, ist das Testen mit if aber immer False, also wird nichts zurückgegeben, wenn nicht überhaupt ein servicestatus-Objekt erstellt wurde. Du hättest also auch schreiben können ... and servicestatus is not none
Antworten