Seite 1 von 1

Problem mit dat.readlines()

Verfasst: Dienstag 15. September 2009, 16:59
von Shaldy
Textdatei:
zeile1
zeile2
zeile3
zeile4

Code: Alles auswählen

data = open(".../text.txt", "r")
lines = data.readlines()
for line in lines:
    line.strip()
Trotzdem ist an allen Strings in lines am Ende "\n"

Mach ich was falsch?

Verfasst: Dienstag 15. September 2009, 17:05
von jbs
irgendwie schon.
was heißt es ist noch da?

strip liefert eine kopie zurück und verändert nicht den string an sich.

außerdem kannst du

Code: Alles auswählen

with open('file') as f:
    for line in f:
        print line.strip()
das readline abkürzen

Verfasst: Dienstag 15. September 2009, 17:12
von cofi
jbs hat geschrieben:strip liefert eine kopie zurück und verändert nicht den string an sich.

Code: Alles auswählen

with open(fname) as fobj:
    lines = [line.strip() for line in fobj]
Wenn du wirklich eine _Liste_ der Daten brauchst. Ansonsten solltest du beim Iterieren ueber ``fobj`` bleiben.

Verfasst: Dienstag 15. September 2009, 17:22
von jbs
Kopie ist eigentlich das falsche Wort. (Die Strings sind ja nicht identisch)
Strings sind nicht veränderbar. Das heißt, wenn du einen String veränderst, dann erzeugst du einen neuen. Du erzeugst hier also für jede Zeile einen neuen String.
Listen sind da ganz anders. Die kann man verändern. Deshalb fuktioniert sort so:

Code: Alles auswählen

l = [1,4,6,3,2]
l.sort()
print l

Verfasst: Dienstag 15. September 2009, 17:23
von numerix
jbs hat geschrieben:strip liefert eine kopie zurück und verändert nicht den string an sich.
Das klingt nun so, als würde ein

Code: Alles auswählen

line = line.strip()
das Problem lösen ... :)

Verfasst: Dienstag 15. September 2009, 17:38
von Shaldy
Alles klar, hatte vergessen, dass line.strip() den eigentlichen String nicht verändert.

Danke!

Verfasst: Mittwoch 16. September 2009, 10:14
von sma
Ich halte `strip` für keine gute Idee, da es möglicherweise zu viel entfernt. Vielleicht sind die Leerzeichen am *Anfang* einer Zeile ja wichtig. Besser ist `rstrip("\n")`.

Dabei verlasse ich mich darauf, dass nicht jemand eine von Windows geschriebene Textdatei als Binärdatei öffnet und daher da auch immer noch `\r`-Zeichen drin sind.

Stefan

Verfasst: Samstag 19. September 2009, 18:21
von str1442
@sma: strip() entfernt (wenn kein anderes Argument gegeben) nicht nur Leerzeichen und Newlines, sondern alle Zeichen die python as "whitespace" definiert, also string.whitespace. Dabei ist auch \r enthalten.

Eigentlich dachte ich, daß readlines() einen Parameter anbietet durch welchen man die Entfernung von Newline Zeichen forcieren kann, aber das stimmt so nicht, ich hatte readlines() mit str.splitlines() verwechselt - diese hat genau einen solchen Parameter.

Ich würde wohl anstatt "line = line.strip()" zu verwenden über "imap(str.strip, fp)" iterieren.

Verfasst: Samstag 19. September 2009, 19:16
von lunar
@str1442: Es ist nicht garantiert, dass die Iteration über Dateiobjekte "str"-Exemplare liefert.

Wenn, dann also "(l.rstrip('\n') for l in fp)".

Verfasst: Sonntag 20. September 2009, 10:35
von sma
str1442 hat geschrieben:@sma: strip() entfernt (wenn kein anderes Argument gegeben) nicht nur Leerzeichen und Newlines, sondern alle Zeichen die python as "whitespace" definiert, also string.whitespace. Dabei ist auch \r enthalten.
Ich weiß. Aber es entfernt eben auch Leerzeichen am Anfang einer Zeile oder Leerzeichen am Ende einer Zeile, die man vielleicht behalten will. Man denke nur mal an Python-Programme die komplett kaputt gehen, wenn man die Leerzeichen (oder TABs) am Anfang alle entfernt.

Stefan