Seite 1 von 1

lines in file.txt untereinander schreiben

Verfasst: Mittwoch 4. Februar 2009, 16:41
von py-mule
Hi zusammen,

wie bekome ich es hin, einen Text, der im Programm als Liste oder String vorliegt in eine .txt Datei zu schreiben, so daß der Text dann auch
Zeile für Zeile untereinander in der .txt Datei steht.

Mein Versuch brachte bisher keinen Erfolg, was mache ich falsch?

Code: Alles auswählen

import codecs

liste = ['line1\n', 'line2\n', 'line3\n', 'line4\n']
    

f = codecs.open(r'C:\\Programme\\p_trainer_test\\Info.txt', 'w', "utf-8")
for line in liste:
    f.writelines(line)
f.close
Vielen Dank und viele Grüße

Verfasst: Mittwoch 4. Februar 2009, 16:51
von snafu
Du musst die Liste und nicht jedes einzelne Element übergeben.

http://docs.python.org/library/codecs.h ... writelines

Verfasst: Mittwoch 4. Februar 2009, 16:57
von EyDu
Und das Escapen des Backslash ist hier falsch. Das macht schon das "r":

Code: Alles auswählen

r'C:\Programme\p_trainer_test\Info.txt'
Und dann schau dir noch mal die "os.path.join" Funktion an.

Sebastian

Verfasst: Mittwoch 4. Februar 2009, 17:11
von py-mule
Nun habe ich es so probiert:

Code: Alles auswählen

import codecs

list = ['line1\n', 'line2\n', 'line3\n', 'line4\n']

f = codecs.open('C:\\Programme\\p_trainer_test\\Info.txt', 'w', "utf-8")

f.writelines(list)
f.close
OK. ums einfacher zu machen habe ich das Escapen des Backslash erst mal weggelassen. os.path.join habe ich angeschaut.

Leider bekomme ich in der.txt Datei nun:

line1[ein kleine quadrat]line2[ein kleine quadrat]line3 usw.

Und nun?

Verfasst: Mittwoch 4. Februar 2009, 17:34
von helduel
Moin,

dein Editor, mit dem du die erstellte Datei anschaust, kommt mit dem \n nicht klar. codecs.open ist das Problem. Normalerweise konvertiert Python den Zeilentrenner \n automatisch in das richtige Zeilentrenn-Format (bei Windows \r\n). Mit codecs.open nicht.

Mach mal folgendes (ungetestet):

Code: Alles auswählen

my_list = ['line1\n', 'line2\n', 'line3\n', 'line4\n']

f = open('C:\\Programme\\p_trainer_test\\Info.txt', 'w')

f.writelines(my_list)
f.close()
Gruß,
Manuel

Verfasst: Mittwoch 4. Februar 2009, 17:42
von py-mule
OK, habs probiert - das Ergebnis:

Traceback (most recent call last):
File "C:/p_trainer/temp2.py", line 5, in <module>
f = open('C:\\Programme\\p_trainer_test\\Info.txt', 'w', "utf-8")
TypeError: an integer is required
>>>


ohne codecs dürfte auch utf-8 einen Fehler produzieren

???

Verfasst: Mittwoch 4. Februar 2009, 17:48
von EyDu
py-mule hat geschrieben:ohne codecs dürfte auch utf-8 einen Fehler produzieren
Weil das buit-in-"open" als dritten Parameter keine Codierung erlaubt. Schaut denn eigentlich niemand mehr in die Doku?

Verfasst: Mittwoch 4. Februar 2009, 18:02
von helduel
Mein Fehler. Hatte zu spät gemerkt, dass ich den dritten Parameter noch stehen gelassen habe. py-mule hat wohl schneller getestet als ich verbessert hab ;-).

Verfasst: Mittwoch 4. Februar 2009, 18:29
von py-mule
Ich weiß daß es mit utf-8 ohne codecs nicht funktioniert. Die Fehlermeldung erscheint aber auch ohne utf-8.

Also stimmt auch etwas anderes noch nicht.

Verfasst: Mittwoch 4. Februar 2009, 18:56
von Hyperion
py-mule hat geschrieben:Ich weiß daß es mit utf-8 ohne codecs nicht funktioniert. Die Fehlermeldung erscheint aber auch ohne utf-8.
Und was ist nun mit codecs und utf-8?

Verfasst: Mittwoch 4. Februar 2009, 19:10
von py-mule
Naja, codecs und utf-8 lassen wir erst mal weg, um den Zeilenumbruch im Texteditor hinzubekommen. Es handelt sich übrigens um denjenigen von MS.

Also, so funktioniert es wenigstens ohne codecs und utf-8:

Code: Alles auswählen

my_list = ['line1\n', 'line2\n', 'line3\n', 'line4\n']
my_string = 'line1\n', 'line2\n', 'line3\n', 'line4\n'

f = open('C:\\Programme\\p_trainer_test\\Info-1.txt', 'w')

f.writelines(my_list)
f.close()

f = open('C:\\Programme\\p_trainer_test\\Info-2.txt', 'w')

f.writelines(my_string)
f.close()
Wenn jemand weiß, wie es mit codecs und utf-8 funktioniert, wäre ich sehr dankbar.

Ich danke euch für eure Beiträge
Viele Grüße
py-mule

Verfasst: Mittwoch 4. Februar 2009, 19:17
von Hyperion
py-mule hat geschrieben:Naja, codecs und utf-8 lassen wir erst mal weg, um den Zeilenumbruch im Texteditor hinzubekommen.
War das nicht Deine Frage? *wunder*
Es handelt sich übrigens um denjenigen von MS.
Das erklärt einiges ... kann der utf-8?

Nimm mal den notepad++ und probiere es damit!
Wenn jemand weiß, wie es mit codecs und utf-8 funktioniert, wäre ich sehr dankbar.
Wurde das von Helduel mal getestet?

btw: my_string ist kein String, sondern ein Tupel ;-)

Verfasst: Donnerstag 5. Februar 2009, 10:21
von helduel
Auszug aus der Doku zu codecs.open:
Note: Files are always opened in binary mode, even if no binary mode was specified. This is done to avoid data loss due to encodings using 8-bit values. This means that no automatic conversion of '\n' is done on reading and writing.
Das heißt, du musst dich um den Line-Separator selber kümmern:

Code: Alles auswählen

my_list = ['line1\r\n', 'line2\r\n', 'line3\r\n', 'line4\r\n']
So sollte es unter Windows funktionieren (kann's nicht testen, da Linux). Wenn du es dynamischer haben willst, dann bastel den Zeilentrenner, der in os.linesep steht dazu:

Code: Alles auswählen

import os
my_list = ['line1', 'line2', 'line3', 'line4']
my_list = [value + os.linesep for value in my_list]
Ansonsten mach's ohne codecs und kümmer dich selbst um das UTF-8, indem du die Strings einfach konvertierst (erst mit dem richtigen coding dekodieren, dann mit utf-8 kodieren) und schreib erst dann in die Datei.

Gruß,
Manuel

Verfasst: Donnerstag 5. Februar 2009, 13:13
von cofi
Anmerkung zu os.linesep:
Das benutzt den Zeilentrenner des _aktuellen_ Systems. Soll heissen unter Unixen sollte man damit keine Text-Dateien für Windows schreiben und andersrum.