Seite 1 von 1

probleme mit "writelines"

Verfasst: Sonntag 8. März 2009, 13:39
von krisi12345
Hi
Ich hab ein paar Probleme mit writelines

So weit Ich weis kann damit mehrere Zeilen in eine Datei schreiben.

Das bekomme Ich aber nicht hin.
HILFE :!:

Verfasst: Sonntag 8. März 2009, 13:46
von cofi
...

Selbst meine Kristallkugel beschwert sich schon über den Post.
Python Library Reference hat geschrieben:file.writelines(sequence)
Write a sequence of strings to the file. The sequence can be any iterable object producing strings, typically a list of strings. There is no return value. (The name is intended to match readlines(); writelines() does not add line separators.)
Wenn das nicht hilft, solltest du uns mal dein Problem erklären .. oder zumindest erst mal nennen.

Verfasst: Sonntag 8. März 2009, 13:51
von krisi12345
Wie sorgt man dafür dass "test1" oder 2 in die nächste Zeile der Datei geschrieben wird?

Code: Alles auswählen

test1 = "zwei"
test2 = "drei"
teste = test1 + test2
test = open("test.txt","w")
test.writelines(teste)
test.close()

Verfasst: Sonntag 8. März 2009, 14:06
von cofi
file.writelines erwartet eine Sequenz, d.h. Tuple, Liste und Konsorten.

Du hast nichts anderes als einen String -> file.write

Code: Alles auswählen

test1 = "zwei"
test2 = "drei"
teste = "%s%s" % (test1, test2)
with open("test.txt","w") as test:
    test.write(teste)

Verfasst: Sonntag 8. März 2009, 14:15
von krisi12345

Code: Alles auswählen

test1 = "zwei"
test2 = "drei"
teste = "%s%s" % (test1, test2)
with open("test.txt","w") as test:
    test.write(teste)
=zweidrei

Es soll aber
zwei und
drei in die nächste zeile sein

Also keine Große Hilfe

Verfasst: Sonntag 8. März 2009, 14:18
von nemomuk

Code: Alles auswählen

test1 = "zwei"
test2 = "drei"
teste = "%s\n%s" % (test1, test2)
with open("test.txt","w") as test:
    test.write(teste)

Verfasst: Sonntag 8. März 2009, 14:20
von yipyip
Natürlich hast Du recht, dass man bei
"writelines()" einen Zeilenseparator erwarten könnte.
Die Doku (und Deine eigenen Erfahrungen) sagen aber,
dass dies nicht der Fall ist.
Also must Du selber einen einsetzen:

Code: Alles auswählen

from __future__ import with_statement

with open('hu', 'w') as fp:
  fp.writelines([('%s' % i) * i + '\n' for i in range(1, 6)])

:wink:
yipyip

Verfasst: Sonntag 8. März 2009, 14:21
von cofi
Du weisst schon, dass du mit der Verkettung von test1 und test 2 nur einen String erzeugst?
Ich glaube du solltest mal das Tutorial durcharbeiten.

Code: Alles auswählen

import os
test1 = "zwei%s" % os.linesep
test2 = "drei%s" % os.linesep
with open("test.txt","w") as test:
    test.writelines([test1, test2])

Verfasst: Sonntag 8. März 2009, 14:50
von BlackJack
@cofi: Wenn Du `os.linesep` benutzt, musst Du auch Textdateien als Binärdateien öffnen, sonst macht Windows da zum Beispiel Murks, weil in `os.linesep` dort das Zeilenende-Zeichen '\n' selbst enthalten ist.

Verfasst: Sonntag 8. März 2009, 15:02
von cofi
Da ich grad kein Windows greifbar hab (und keine Klimbzüge mit Wine machen will): Wie unterscheidet sich das denn von einem manuellen "\r\n" ? os.linesep ist schliesslich ein schlichter String oO

Wobei es mich aber nicht wirklich überrascht, dass Windows querschiesst ;)

Verfasst: Sonntag 8. März 2009, 15:08
von Trundle
Wenn du die Datei nicht im Binärmodus öffnest, werden '\n' von der libc durch `os.linesep` ersetzt. Unter Windows übergibst du '\r\n'. Jetzt wird aber das '\n' ersetzt, also kommt am Ende '\r\r\n' heraus.

Verfasst: Sonntag 8. März 2009, 15:12
von krisi12345
DANKE-SCHÖN!!!

Verfasst: Sonntag 8. März 2009, 15:16
von cofi
Ah .. gut zu wissen, danke.