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
while line=file.readline() != "":
Wieso sollte das nicht gehen, sieht nur etwas komplizierter aus:
Edit: habe das line == "", ist ja richtig, das dies ja schon in while geprüft wird.
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()
Zuletzt geändert von Xynon1 am Freitag 15. Oktober 2010, 06:10, insgesamt 1-mal geändert.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
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).Xynon1 hat geschrieben:Wieso sollte das nicht gehen, sieht nur etwas komplizierter aus:
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)
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
@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:
# ...
-
- User
- Beiträge: 3
- Registriert: Dienstag 27. Juli 2010, 09:43
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).cofi hat geschrieben:Xynon1 hat geschrieben:Wieso sollte das nicht gehen, sieht nur etwas komplizierter aus:
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)
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
Danke, das sieht schon viel schöner aus. Ich merke immer wieder, dass ich bei Python noch nicht so wirklich fitt bin.
@Kreuzotter: `readline()` wird einfach nie die leere Zeichenkette zurückgeben, darum kann der Vergleich auch nie wahr werden.
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.
Gib einfach mal in der else print string an, dann siehst du was ich meine.
Werde demnächst drauf achten.cofi hat geschrieben:@Xynon1: Und bitte posten Beispielcode der Dateien richtig oeffnet, z.b. mit `with` oder `try ... finally`
".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:
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.
Code: Alles auswählen
String line;
while ((line = reader.readLine()) != null) { … }
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
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: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.
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.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?
P.S. Bitte achte in Zukunft darauf deine Quotes nicht zu verstuemmeln
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte