Bestimmte Zeile ausgeben

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
Ingo
User
Beiträge: 59
Registriert: Dienstag 21. Oktober 2008, 09:51

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
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

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]

Ingo
User
Beiträge: 59
Registriert: Dienstag 21. Oktober 2008, 09:51

Danke das funktioniert.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

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
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
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 ...
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
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?
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

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?
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Gut, das überzeugt mich, dass man es so pauschal nicht sagen kann, nicht nur des Stils wegen...
Antworten