lines in file.txt untereinander schreiben

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
py-mule
User
Beiträge: 58
Registriert: Samstag 3. Januar 2009, 10:42

Mittwoch 4. Februar 2009, 16:41

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
Benutzeravatar
snafu
User
Beiträge: 5494
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mittwoch 4. Februar 2009, 16:51

Du musst die Liste und nicht jedes einzelne Element übergeben.

http://docs.python.org/library/codecs.h ... writelines
shcol (Repo | Doc | PyPi)
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mittwoch 4. Februar 2009, 16:57

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
py-mule
User
Beiträge: 58
Registriert: Samstag 3. Januar 2009, 10:42

Mittwoch 4. Februar 2009, 17:11

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?
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Mittwoch 4. Februar 2009, 17:34

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
py-mule
User
Beiträge: 58
Registriert: Samstag 3. Januar 2009, 10:42

Mittwoch 4. Februar 2009, 17:42

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

???
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mittwoch 4. Februar 2009, 17:48

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?
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Mittwoch 4. Februar 2009, 18:02

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 ;-).
py-mule
User
Beiträge: 58
Registriert: Samstag 3. Januar 2009, 10:42

Mittwoch 4. Februar 2009, 18:29

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 4. Februar 2009, 18:56

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?
py-mule
User
Beiträge: 58
Registriert: Samstag 3. Januar 2009, 10:42

Mittwoch 4. Februar 2009, 19:10

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 4. Februar 2009, 19:17

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 ;-)
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Donnerstag 5. Februar 2009, 10:21

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
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Donnerstag 5. Februar 2009, 13:13

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.
Antworten