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.
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: 4600
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: 4600
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: 4600
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