while line=file.readline() != "":

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
Kreuzotter
User
Beiträge: 3
Registriert: Dienstag 27. Juli 2010, 09:43

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
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Nein geht nicht.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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.
Zuletzt geändert von Xynon1 am Freitag 15. Oktober 2010, 06:10, insgesamt 1-mal geändert.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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`
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:
        # ...
Kreuzotter
User
Beiträge: 3
Registriert: Dienstag 27. Juli 2010, 09:43

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 :D . 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.
BlackJack

@Kreuzotter: `readline()` wird einfach nie die leere Zeichenkette zurückgeben, darum kann der Vergleich auch nie wahr werden.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 ;)
Antworten