Problem mit dat.readlines()

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
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

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?
Dies ist keine Signatur!
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ... :)
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

Alles klar, hatte vergessen, dass line.strip() den eigentlichen String nicht verändert.

Danke!
Dies ist keine Signatur!
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

@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.
lunar

@str1442: Es ist nicht garantiert, dass die Iteration über Dateiobjekte "str"-Exemplare liefert.

Wenn, dann also "(l.rstrip('\n') for l in fp)".
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Antworten