Seite 1 von 1
while line=file.readline() != "":
Verfasst: Donnerstag 14. Oktober 2010, 17:55
von Kreuzotter
Hallo,
gibt es in Pyhton die Möglichkeit eine Schleife wiefolgt zu realisieren?
while line=file.readline() != "":
also dass der Variable line die Rückgabe der readline Funktion zugeordnet wird und diese dann bezüglich der Bedingung des leeren Strings überprüft wird?
Ich weiß dass es sowas für andere Programmiersprachen gibt. Leider weiß ich auch nicht wie sowas bezeichnet wird und kann daher auch nicht wirklich danach suchen.
Vielen Dank
Re: while line=file.readline() != "":
Verfasst: Donnerstag 14. Oktober 2010, 17:57
von hendrikS
Nein geht nicht.
Re: while line=file.readline() != "":
Verfasst: Donnerstag 14. Oktober 2010, 18:10
von Xynon1
Wieso sollte das nicht gehen, sieht nur etwas komplizierter aus:
Code: Alles auswählen
f = open("text")
line = f.readline()
while line:
if line == "\n":
print ("leer")
# oder break wenn du wirklich hier unterbrechen willst
else:
print (line)
line = f.readline()
f.close()
Edit: habe das line == "", ist ja richtig, das dies ja schon in while geprüft wird.
Re: while line=file.readline() != "":
Verfasst: Donnerstag 14. Oktober 2010, 18:20
von cofi
Xynon1 hat geschrieben:Wieso sollte das nicht gehen, sieht nur etwas komplizierter aus:
Nein. Dem OP ging es explizit um die Zuweisung in der Bedingung. Dein Umweg benoetigt viel mehr Zeilen (das `line == ""` wird uebrigens niemals wahr sein).
Das Python das nicht kennt ist im uebrigen ein Feature

Man kann aber aequivalentes mit `iter` bauen:
Code: Alles auswählen
for non_empty_line in iter(f.readline, ""):
do_foo(non_empty_line)
@Xynon1: Und bitte posten Beispielcode der Dateien richtig oeffnet, z.b. mit `with` oder `try ... finally`
Re: while line=file.readline() != "":
Verfasst: Donnerstag 14. Oktober 2010, 18:29
von lunar
@Kreuzotter: Man kann in Python direkt über alle Zeilen einer Datei iterieren:
Code: Alles auswählen
with open('foo', 'r') as stream:
for line in stream:
# ...
Re: while line=file.readline() != "":
Verfasst: Donnerstag 14. Oktober 2010, 18:33
von Kreuzotter
cofi hat geschrieben:Xynon1 hat geschrieben:Wieso sollte das nicht gehen, sieht nur etwas komplizierter aus:
Nein. Dem OP ging es explizit um die Zuweisung in der Bedingung. Dein Umweg benoetigt viel mehr Zeilen (das `line == ""` wird uebrigens niemals wahr sein).
Das Python das nicht kennt ist im uebrigen ein Feature

Man kann aber aequivalentes mit `iter` bauen:
Code: Alles auswählen
for non_empty_line in iter(f.readline, ""):
do_foo(non_empty_line)
So richtig schön find ich das jetzt nicht. Aber immhin ist es recht kurz. Auch wenn es etwas umständlicher ist als die direkte Zuweisung in der Schleife.
Dake für den Hinweis

. Glaub da wäre ich so nicht drauf gekommen.
Kannst du noch kurz schreiben wieso das `line == ""` nie wahr werden wird? Habe ich jetzt noch nicht ganz verstanden. Generell ist doch auch bei Strings ein Prüfen mit == und != möglich oder?
Code: Alles auswählen
>>> def foo(string):
... if string == "":
... print "Leer"
... else:
... print "vorhanden"
...
>>> s1 = ""
>>> s2 = "TEST!!"
>>> foo(s1)
Leer
>>> foo(s2)
vorhanden
@lunar:
Danke, das sieht schon viel schöner aus. Ich merke immer wieder, dass ich bei Python noch nicht so wirklich fitt bin.
Re: while line=file.readline() != "":
Verfasst: Donnerstag 14. Oktober 2010, 19:28
von BlackJack
@Kreuzotter: `readline()` wird einfach nie die leere Zeichenkette zurückgeben, darum kann der Vergleich auch nie wahr werden.
Re: while line=file.readline() != "":
Verfasst: Donnerstag 14. Oktober 2010, 19:31
von Xynon1
weil du immer an den Strings ein \n für ende der zeile dran hast, im win kann glaube ich auch ein \n\r oder war es \r\n dran hängen. --> auch bei leeren zeilen
Gib einfach mal in der else print string an, dann siehst du was ich meine.
cofi hat geschrieben:@Xynon1: Und bitte posten Beispielcode der Dateien richtig oeffnet, z.b. mit `with` oder `try ... finally`
Werde demnächst drauf achten.
Re: while line=file.readline() != "":
Verfasst: Donnerstag 14. Oktober 2010, 19:46
von lunar
".readline()" gibt am Ende der Datei sehr wohl eine leere Zeichenkette zurück. Ich glaube, der OP wollte dieses Verhalten nutzen, um
alle Zeilen zu lesen, nicht lediglich die nicht-leeren, denn der Quelltext im ersten Beitrag erinnert doch stark an das gängige Java-Idiom zum zeilenweisen Lesen einer Datei:
Code: Alles auswählen
String line;
while ((line = reader.readLine()) != null) { … }
Der Vergleich mit der leeren Zeichenkette nur in dieser speziellen Situation nie wahr, da die "while"-Schleife ja bereits auf "line" bedingt ist und somit nur und ausschließlich dann betreten wird, wenn "line" eben keine leere Zeichenkette ist. Zum Zeitpunkt des Vergleichs ist "line" also garantiert eine nicht-leere Zeichenkette, so dass der Vergleich niemals wahr werden kann.
Re: while line=file.readline() != "":
Verfasst: Donnerstag 14. Oktober 2010, 21:45
von cofi
Kreuzotter hat geschrieben:So richtig schön find ich das jetzt nicht. Aber immhin ist es recht kurz. Auch wenn es etwas umständlicher ist als die direkte Zuweisung in der Schleife.
Nunja, es ist in dem konkreten Fall auch nicht mehr Arbeit, Zuweisungen in der Schleifenbedingung haben aber schon viele relativ schwer zu findende Fehler verursacht.
Kreuzotter hat geschrieben:Kannst du noch kurz schreiben wieso das `line == ""` nie wahr werden wird? Habe ich jetzt noch nicht ganz verstanden. Generell ist doch auch bei Strings ein Prüfen mit == und != möglich oder?
Natuerlich - der Hinweis war ja auch an Xynon1 gewandt - nur pruefte der der Code eben schon implizit, ob `line` leer is, da `""` zu `False` evaluiert und die `while`-Suite so nie betreten wird.
P.S. Bitte achte in Zukunft darauf deine Quotes nicht zu verstuemmeln
