Probleme mit Exceptions

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.
Antworten
recnice
User
Beiträge: 45
Registriert: Sonntag 20. März 2011, 12:10

Hallo,
folgendes Problem:
ich habe ein Master-File in dem bestimmte Platzhalter stehen
  • #-----Eventuell einen Status laden
    ${LOAD_STATUS}

    #-----Enzeit
    hier sollte eigentlich ${End_TIME} stehen
    #-----Eventuell Status rausschreiben
    ${WRITE_STATUS}
Mein Python-Programm soll nun das Master-File öffen und die Platzhalter umbenennen und in eine neue aktuallisiert Datei generieren.
Das funktioniert soweit auch :lol: ! Was ich nun machen wollte ist folgendes:
Da alle Platzhalter in dem Maste-File enthalten sein müssen, möchte ich, dass sobald ein Platzhalter fehlt, in diesem Beispiel ${END_TIME}dass das Programm abgebrochen wird.
So sieht der Code aus:
W

Code: Alles auswählen

def edit_cmd(CMD_MASTER,CMD_NEW):
	
	with open(CMD_MASTER,'r') as infile:
		with open(CMD_NEW,'w') as outfile:
			data = infile.readlines()
			for eintrag in data:
				try:
					#print eintrag
					if '${END_TIME}' in eintrag:
							pandas_Time(outfile)
							
					elif '${WRITE_STATUS}' in eintrag:
							#save status
							pandas_save_status(outfile)	
					
					else:
						outfile.write(eintrag)
				except NameError:
					sys.exit('%s nicht gefunden' %eintrag)
Wie gesagt, ist '${END_TIME}'' in dem Master-file nicht enthalten, somit müsste das Programm abgebrochen werden und ein neues File dürfte nicht generiert werden. Was passiert ist folgendes:
#-----Eventuell einen Status laden
${LOAD_STATUS}

#-----Enzeit


#-----Eventuell Status rausschreiben
save status_step1.5 mesh ascii gzip
'${END_TIME} ist nicht vorhanden, trotzdem bricht das Programm nicht ab,
hat jemand eine Idee woran es liegt???
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Verstehe ich es (ausgehend von deinem Codestück) richtig, dass du glaubst, Python wirft einen `NameError`, sobald eine bestimmte Zeichenkette nicht in einem String enthalten ist? Falls ja, dann kann ich dir jetzt schon sagen, dass dies nicht passieren wird... ^^
recnice
User
Beiträge: 45
Registriert: Sonntag 20. März 2011, 12:10

Ja dass hatte ich gehofft. :oops:
"raised when a local or global name is not found"

Was wäre denn die richtige exception??
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Überhaupt keine. Für Python ist das nur eine Zeichenkette. Die Programmiersprache weiß nicht auf magische Weise, dass der Teilstring innerhalb deiner Datei als Platzhalter verwendet wird. Die "X-in-Y"-Prüfung gibt einen Wahrheitswert zurück - mehr nicht.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Und bevor du jetzt wie wild rumprobierst (dein Code sieht nicht gerade berauschend aus), empfehle ich einen Blick in die deutsche Version des offiziellen Python-Tutorials. Es ist nicht zielführend, dir ernsthaft zu helfen, wenn du die verwendete Programmiersprache nichtmal in ihren Grundzügen kennst (und so scheint es mir ehrlich gesagt).
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@recnice: Ist das Masterfile mit seiner Template-Syntax fix vorgegeben? Wenn nein, solltest Du evtl. darüber nachdenken, eine vorhandene Template-Engine zu nutzen und das Format entsprechend umzustellen :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
recnice
User
Beiträge: 45
Registriert: Sonntag 20. März 2011, 12:10

@ Hyperion
Die Syntax ist fix.
Die Idee war nur, falls bei dem erstellen des Masterfiles, im Eifer des Gefechts, vergessen wrid ein Platzhalter zu setzten, eben dies
zu beginn des Programms erkannt wird und nicht irgendwann später.... :roll:
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Protip: Man kann nur Ausnahmen behandeln, die auch tatsächlich auftreten. Wenn du dir unsicher bist welche geworfen wird oder ob überhaupt eine geworfen wird, dann lass die Fehlerbehandlung weg und provoziere einen Fehler um zu sehen welche kommen.

Bei diesem schrittweisen Vorgehen baust du dir von den absoluten Grundlagen ein lauffähiges Programm auf anstatt eine Menge Quellcode zu schreiben um später zu bemerken, dass du verdammt viel umschreiben musst bis er läuft.
Zuletzt geändert von webspider am Freitag 9. März 2012, 12:06, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

recnice hat geschrieben:@ Hyperion
Die Syntax ist fix.
Darf man fragen aus welchem Kontext das stammt? Evtl. gibt es für das Format ja sogar einen fertigen Parser!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
recnice
User
Beiträge: 45
Registriert: Sonntag 20. März 2011, 12:10

Ich arbeite mit einem FEM-Programm das bei uns am Institut entwickelt wurde. Ich denke nicht dass es dafür Parser gibt :D

Gruß
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Na gut, dann musst Du eben manuelle einen Parser schreiben. Wenn das Format nicht komplexer wird, d.h. Tags nicht in Kommentaren vorkommen, immer nur ein Tag pro Zeile usw., dann sollte das nicht so schwierig sein.

Ich würde mir ein Dictionary (Tag-Name -> Wert) anlegen und in jeder Zeile der Datei nach einem Vorkommen des Keys suchen. Wenn ja, ersetzt man es durch den in einem Dictionary dafür vorgesehenen Wert. Dann fügt man an eine "Check"-Liste den Key hinzu. Am Ende kannst Du dann einfach mittels zweier ``sets`` testen, welche Du zum einen aus den Keys des Dictionaries und zum anderen aus der "Check"-Liste generierst, ob alle Tags in der Datei enthalten waren.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lunar

Wieso reden alle vom Parsen?! Wenn es nur darum geht, Platzhalter ohne Rücksicht auf das Format der Datei zu ersetzen, reicht Template.safe_substitute(). Wenn Du vorher prüfen willst, ob auch alle Platzhalter vorhanden sind, reicht ein einfacher "in" Test auf der gelesenen Datei.

Ansonsten kann ich mich meinen Vorrednern nur anschließen: Die Idee, "NameError" abzufangen, um das Fehlen von Platzhaltern zu erkennen, ist so absurd, dass ich Dir auch dringend rate, erst einmal die Sprache zu lernen, bevor Du in dieser Sprache möglicherweise produktiv genutzte Programm schreibst. Nichts für ungut...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:Wieso reden alle vom Parsen?! Wenn es nur darum geht, Platzhalter ohne Rücksicht auf das Format der Datei zu ersetzen, reicht Template.safe_substitute(). Wenn Du vorher prüfen willst, ob auch alle Platzhalter vorhanden sind, reicht ein einfacher "in" Test auf der gelesenen Datei.
Ich vermute dass es den anderen ähnlich ging wie mir, und sie nicht wussten, das ``${PLATZHALTER}`` in ``string.Template`` gültige Syntax ist, statt nur ``$PLATZHALTER``. Und ja, in dem Fall ist das natürlich die beste Lösung, was für ein Glück dass das Format mehr oder minder zufällig diese Syntax nutzt :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Leonidas hat geschrieben: Ich vermute dass es den anderen ähnlich ging wie mir, und sie nicht wussten, das ``${PLATZHALTER}`` in ``string.Template`` gültige Syntax ist, statt nur ``$PLATZHALTER``. Und ja, in dem Fall ist das natürlich die beste Lösung, was für ein Glück dass das Format mehr oder minder zufällig diese Syntax nutzt :)
Ok, war ich also nicht der einzige, der das nicht wusste :D Ich hatte es nach lunars Posting gleich probiert und war tatsächlich überrascht, dass das ohne Subclassing out-of-the box funzt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten