Seite 1 von 1

Bestimmte Zeile ausgeben

Verfasst: Donnerstag 16. April 2009, 13:00
von Ingo
Hallo
ich habe folgendes Problem:
Ich habe einen Text der in zwei Zeilen geschrieben ist und ich möchte einfach nur die erste Zeile einer Variablen übergeben.
Kann mir jemand helfen

Re: Bestimmte Zeile ausgeben

Verfasst: Donnerstag 16. April 2009, 13:14
von keppla
Ingo hat geschrieben:Hallo
ich habe folgendes Problem:
Ich habe einen Text der in zwei Zeilen geschrieben ist und ich möchte einfach nur die erste Zeile einer Variablen übergeben.
Kann mir jemand helfen
vielleicht hilft dies:

Code: Alles auswählen

text = """erste zeile
zweite zeile"""

lines = text.split("\n")
print line[1]
ps. bei variablen spricht man von zuweisungen, übergaben hat man in funktionen.

Verfasst: Donnerstag 16. April 2009, 13:14
von Barabbas
Das geht recht einfach mit split(). "\n" steht für einen Zeilenumbruch.

Code: Alles auswählen

text = "dies ist ein \n test"
lines = text.split("\n")
if len(lines) > 1:
    zweite_zweile =  lines[1]


Verfasst: Donnerstag 16. April 2009, 13:55
von Ingo
Danke das funktioniert.

Verfasst: Donnerstag 16. April 2009, 14:42
von snafu
Barabbas hat geschrieben:Das geht recht einfach mit split(). "\n" steht für einen Zeilenumbruch.

Code: Alles auswählen

text = "dies ist ein \n test"
lines = text.split("\n")
if len(lines) > 1:
    zweite_zweile =  lines[1]

Ich würde Zeile 3 ja weglassen. Wenn man explizit die zweite Zeile will, aber diese nicht existiert, dann sollte man es IMHO auf eine Exception ankommen lassen.

Verfasst: Donnerstag 16. April 2009, 16:04
von Barabbas
Jo, magst du prinzipiell recht haben, aber wenn es die Möglichkeit gibt, dass an dieser Stelle eine Exception geworfen wird, die das Programm abbricht, muss man dem Benutzer auch darüber informieren, was gerade passiert ist. Ich finde es ärgerlich, wenn ein Benutzer mein Programm testet, sieht, dass irgendwas nicht funktioniert und es dann direkt in den Papierkorb packt. Eine Meldung, die zumindest sagt "Hier stimmt was nicht, versuch es einfach nochmal oder schreib mir" finde ich da enorm motivationssteigernd, weil der Benutzer nicht den Eindruck bekommt, dass das Programm unfertig ist oder auf seinem System nicht läuft. Ein einfaches "if...else..." hat nun wirklich keine großen Nachteile - und man hält sich selbst dazu an, auf die Ausnahme hin zu coden.

Ich bin aber auch kein Informatiker - will also nicht für mich in Anspruch nehmen, gängige Programmierparadigmen zu kennen.

lG

brb

Verfasst: Donnerstag 16. April 2009, 16:34
von snafu
Exceptionhandling ist aber halt ein wesentlicher Bestandteil bei Python. Wenn man auf alles selber testet, kann man das schon fast abschaffen. ;)

Ich würde es so in der Art machen:

Code: Alles auswählen

try:
    second_line = text.split('\n')[1]
except IndexError:
    print >> sys.stderr, 'FEHLER: Zweite Zeile nicht vorhanden'
Der wirkliche Vorteil zeigt sich IMHO dann, wenn man funktional programmiert. Dann wäre das Einfangen der zweiten Zeile in der Funktion `get_second_line()`, würde von der `main()`-Funktion aufgerufen werden und diese kümmert sich um das Exceptionhandling, d.h. die `get_second_line()` müsste sich keinen Rückgabewert ausdenken, der bei einer zu kleinen Zeilenanzahl (erstes Mal `if-else`) käme und danach nochmal von `main()` interpretiert werden müsste (zweites Mal `if-else`). Mag in dem Fall nicht relevant sein, aber ich finde man kann sich ruhig an sowas gewöhnen.

Verfasst: Donnerstag 16. April 2009, 16:48
von lunar
Findest du? Dein Code ist länger, langsamer und verschleiert die eigentliche Bedingung, die für Liste gelten soll. Zudem birgt das immer auch die Gefahr, dass man mehr abfängt als man eigentlich möchte.

Ausnahmen sind ja gut und schön, aber man kann es auch übertreiben ...

Verfasst: Donnerstag 16. April 2009, 16:54
von snafu
Im anderen Beispiel wiederum existiert "zweite_zeile" bei zu wenig Zeilen nicht und man bekommt einen NameError, wenn man darauf zugreifen will. Finde ich nicht wirklich schöner.

Verfasst: Donnerstag 16. April 2009, 17:07
von lunar
snafu hat geschrieben:Im anderen Beispiel wiederum existiert "zweite_zeile" bei zu wenig Zeilen nicht und man bekommt einen NameError, wenn man darauf zugreifen will. Finde ich nicht wirklich schöner.
Das bei dir nicht anders ist, im except-Block existiert dieser Name auch nicht. Das Argument, die Ausnahme würde im echten Programm nach oben durchgereicht, zählt hier nicht. Wenn der Fehlerfall lokal nicht von Interesse ist, dann würde man auch keine Abfrage davor setzen.

Abgesehen davon wäre es auch völlig unsinnig, wenn dieser Name dann existieren würde, denn eine zweite Zeile gibt es dann nicht, warum also sollte irgendjemand darauf zugreifen wollen?

Verfasst: Donnerstag 16. April 2009, 18:19
von Barabbas
Auch können die Standard Exceptions in manchen Fällen sehr irritierend sein: Ein IndexError oder ein NameError oder ein ValueError kann in einem bestimmten Kontext alles mögliche bedeuten. Wenn man diese Fehler auf höhere Ebene abfangen muss und daraus dann Schlüsse zieht wie "Datei nicht vorhanden" oder "Ungültiges Format", ist der Code m.E. nicht mehr wirklich übersichtlich.
In solchen Fällen müssen die Exceptions handgemacht werden (z.B. FORMAT_ERROR), was dann auch nicht wirklich ökonomisch ist, da dann jeder Fehler einmal in der eigentlichen Funktion gehandelt werden muss, um den entsprechenden handgemachten Fehler zu raisen und dann nochmal in der aufrufenden Funktion, um den handgemachten Fehler abzufangen.

Das mag im Falle des "selbst testens" zwar ähnlich sein - es scheint aber nicht zu stimmen, dass die Exceptions in diesem Fall eine Erleichterung darstellen.

Exceptions finde ich da sinnvoll, wo es zu umständlich wäre, jede einzelne Bedingung vorher zu testen und wo es im Endeffekt auch nicht von Interesse ist, welcher Fehler (von einer vorher festgelegten Menge) genau auftritt: In manchen Fällen zählt nur, DASS ich eine Datei nicht schreiben kann. Hier fände ich es müßig zu testen, ob ich Schreibrechte habe und ob gerade ein Lock auf die Datei besteht oder mich sonstwas am Schreiben hindert. In solchen Fällen benutze ich gerne Exceptions: "Kann Datei X nicht schreiben".
Falls eine Datei kopiert werden soll, würde ich aber schon vorher testen, ob die Quelle existiert. Hier macht es eben einen Unterschied, ob die Datei gar nicht vorhanden ist, oder ob ich keine Schreibrechte im Zielordner habe.

Also ein wenig auch eine Stilfrage, oder?

Verfasst: Donnerstag 16. April 2009, 19:18
von snafu
Gut, das überzeugt mich, dass man es so pauschal nicht sagen kann, nicht nur des Stils wegen...