Zeilenumbruch in der Textfile

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.
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

Zeilenumbruch in der Textfile

Beitragvon marco_ » Samstag 7. Mai 2005, 16:07

Bekanntermaßen wird bei f.readlines() der Zeilenumbruch als "\n" dargestellt. Nur leider wird dieser beim schreiben in eine Datei f.write() als \n und nicht als Zeilenumbruch dargestellt. Gibt es eine Möglichkeit die mit readlines() ausgelesene Liste nach bearbeiten wieder als Datei ohne \n sondern mit Zeilenubruch gespeichert wird?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Samstag 7. Mai 2005, 16:27

Mit Verlaub: Das klingt etwas wirr. Ich hoffe, daß ich trotzdem mit meiner Antwort Deine Frage treffe.

Wenn Du mit write() eine Zeile ausschreiben möchtest mußt Du explizit '\n' anhängen, um den Zeilenumbruch zu generieren.

Wenn das jetzt nicht ganz die Antwort auf Deine Frage war, mußt du halt nochmal neu fragen - oder ein anderer rät besser. ;-)

Gruß,
Christian
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 7. Mai 2005, 17:02

Ich hab' mir ein kleines Programm geschrieben, das erstmal eine Datei mit Zeilenumbrüchen erstellt, diese dann öffnet, wobei die Strings mit \n hinten dran sind und die Datei dann nochmal überschreibt, mit den ausgelesenen Werten. Hat überhaupt keine Probleme gemacht, in der überschriebenen Datei sind Zeilenumbrücke, keine \n drin.

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-
content = """Haskell
O'Caml
Lisp
Ruby
Python
Scheme"""

filename = 'write.file'

def writefile():
    f = file(filename, 'w')
    f.write(content)
    f.close()

def openfile():
    f = file(filename, 'r')
    c = f.readlines()
    f.close()
    return c

def writecontent(c):
    f = file(filename, 'w')
    [f.write(line) for line in c]
    f.close()

def main():
    writefile()
    c = openfile()
    writecontent(c)

if __name__ == '__main__':
    main()
My god, it's full of CARs! | Leonidasvoice vs Modvoice
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

Beitragvon marco_ » Samstag 7. Mai 2005, 17:10

bin leicht verwirrt heute, ich versuchs nochmal. Mit einem Beispiel:

Test.txt:

Code: Alles auswählen

Zeile
Drei
Vier
Eins


Code: Alles auswählen

>>> f = open("Test.txt","r")
>>> inh = f.readlines()
>>> f.close()
>>> print inh
['Zeile\n', 'Drei\n', 'Vier\n', 'Eins']
>>> for s in inh:
...    inh[inh.index(s)] = inh[inh.index(s)].rstrip('\n')
...
>>> inh
['Zeile', 'Drei', 'Vier', 'Eins']
>>> inh.append("Zwei")
>>> f = file("Test2.txt","w")
>>> f.write(str(inh))
>>> f.close()
>>> f = file("Test3.txt","w")
>>> f.writelines(inh)
>>> f.close()


Test2.txt:

Code: Alles auswählen

['Zeile', 'Drei', 'Vier', 'Eins', 'Zwei']

Test3.txt:

Code: Alles auswählen

ZeileDreiVierEinsZwei


Ich will aber jeden Inhalt der Liste in eine Extra Zeile, also so:

Code: Alles auswählen

Zeile
Drei
Vier
Eins
Zwei



Beispiel ist dumm, aber mir ist spontan nichts besseres eingefallen. Soll eben nur als Beispiel dienen.
Selbst wenn ich die \n dann wieder anhänge schreibt er sie mit in eine Zeile
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Samstag 7. Mai 2005, 17:46

Code: Alles auswählen

f = open("Test.txt","r")
inh = f.read().split("\n")
f.close()
print inh

inh.append("Zwei")

f = file("Test2.txt","w")
for line in inh:
    f.writeline(line)
f.close()


oder

Code: Alles auswählen

f = file("Test2.txt","w")
f.write( "\n".join( inh ) )
f.close()

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
marco_
User
Beiträge: 78
Registriert: Freitag 25. März 2005, 12:24

Beitragvon marco_ » Samstag 7. Mai 2005, 17:52

Zum x-ten mal Danke,

@Leonidas, sory hab deinen Beitrag gar nicht gesehen, hab solange mit dem Beispiel herum getan, da hast du wahrscheinlich währenddessen den Beitrag erstellt.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Samstag 7. Mai 2005, 17:55

Ach, was ich noch erwähnen wollte, was dir aber wahrscheinlich eh klar ist: Du kannst natürlich auch mit f = open("Test.txt","a") was an die TXT-Datei einfach dranhängen ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 7. Mai 2005, 17:57

Das ist ja kein Wunder. Guck doch mal was writelines() macht, oder eher nicht macht:
http://docs.python.org/lib/bltin-file-objects.html hat geschrieben: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.)


Gehen wir mal von deiner Test.txt aus:

Code: Alles auswählen

>>> f = file('Test.txt', 'r')
>>> inh = f.readlines()
>>> f.close()
>>> inh
['Zeile\n', 'Drei\n', 'Vier\n', 'Eins\n']
>>> inh = [line.rstrip() for line in inh]
>>> inh
['Zeile', 'Drei', 'Vier', 'Eins']
>>> f = file('Test2.txt', 'w')
>>> [f.write(line, + '\n') for line in inh]
>>> f.close()

So leicht geht das, bei Gelegenheit haben wir gleich mal zwei hübsche LCs benutzt.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Beitragvon BlackJack » Samstag 7. Mai 2005, 20:52

Nur eine hübsche LC -- die zweite finde ich eher hässlich. Eine LC ist dazu da eine Liste zu erstellen. IMHO sollte das auch eine sinnvolle Liste sein und keine voller `None` Objekte die dann nicht benutzt werden.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 7. Mai 2005, 22:23

Okay, dann nur eine hübsche LC, aber gar so hässlich finde ich die zweite LC nicht 8)
Da das ja None-Objekte sind, hab ich sie auch gar nicht erst an irgendeinen Namen gebunden.. ich habe halt dort eine LC eingesetzt um zu gucken, ob das möglich ist.. ja, ist es. Blos die Performance ist warscheinlich Subptimal, da man die None-Liste die erstellt wird ja nicht braucht.
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: brainstir