Seite 1 von 1

Textdateien bearbeiten

Verfasst: Dienstag 15. April 2003, 21:37
von Frawe
Hallo Jungs,

ich bin in Python noch ein ziemlicher Newbie muss jedoch sagen, dass mir die Programmiersprache zusagt. Daher habe ich nun eine Frage, welches Modul ist am besten dazu geeignet mit Textdateien zu arbeiten.
Ich möchte genauer gesagt eine ganze Textdatei einlesen um sie dann als einen String zu verwalten. Des weiteren möchte ich am Ende eine Zeile anfügen.
Wär nicht schlecht wenn ihr mir helfen könntet, am besten mit Bsp. Quellcode

Verfasst: Dienstag 15. April 2003, 22:50
von strogon14
Dafür brauchst Du kein Modul. Python kann von Haus aus wunderbar mit Dateien und Strings umgehen.

Z.B. eine Datei komplett in einen String einlesen:

Code: Alles auswählen

f = open('datei.txt')
s = f.read()
's' enthält jetzt den kompletten Inhalt der Datei inklusive aller Zeilenendezeichen.

Willst du die einzelnen Zeilen bearbeiten, ist es sinnvoll die Zeilen einer Textdatei in eine Liste von Strings einzulesen:

Code: Alles auswählen

f = open('datei.txt')
l = f.readlines()
'l' ist jetzt eine Liste von Strings, die jeweils mit newline (unter Unix) abgeschlossen sind.

Willst du eine Zeile an die Datei anfügen, geht das auch ganz leicht:

Code: Alles auswählen

f = open('datei.txt')
l = f.readlines()
f.close()
l.append('Eine neue Zeile\n')
f = open('datei,txt', 'w') # Datei in Schreibmodus oeffnen. 
                           # Achtung: alter Inhalt wird geloescht
f.write("".join(l))       # Strings in Liste wieder zusammenfügen
                           # und in Datei schreiben
f.close()
Beantwortet das Deine Frage?

Verfasst: Mittwoch 16. April 2003, 09:02
von Milan
Und falls du nix am bisherigen Dateiinhalt ändern willst, sondern nur an eine Datei etwas anfügen willst, kannst du die Datei auch in Anfügemodus öffnen und dann reinschreiben:

Code: Alles auswählen

f=open('textdatei.txt','a') #das a sorgt für den Anfügemodus beim öffnen
f.write('Dies ist eine weitere Zeile\n') #´Damit schreibst du eine neue Zeile hinten an die Datei dran, das "\n" ist das Zeilenende (Newline)
f.close() #und die Datei wieder schließen
@strogon: es gibt auch ne Funktion writelines, die die Liste String für String in die Datei schreibt ;) :)

Verfasst: Mittwoch 16. April 2003, 20:53
von frawe
Danke Leute,
hat richtig gut gefunzt.
Ich habe nur ein Problem,
wenn ich die Datei einlesen will, muss ich stets den ganzen Pfad angeben.
Geht das nicht auch universeller, so dass, wenn die Textdatei schon im gleichen Verzeichnis ist, diese auch einfach per Namen aufgerufen werden kann. Wenn ich das versuche, gibt er mir immer aus das die Datei nicht gefunden wurde.

Verfasst: Donnerstag 17. April 2003, 06:44
von Milan
Das geht genauso wie du das willst, aber ich nehme mal an, dass du per IDLE unter win arbeitest. IDLE wird im Pythonverzeichniss gestartet und somit denkt Python dein Script würde dort liegen. Wenn du Python aber direkt dein Script ausführen lässt (wenn es unter win ist, sollten .py-Dateien mit dem Interpreter verknüpft sein, also einfach drauf doppelklicken) ist der aktuelle Pfad der deines Scriptes. Dann geht das auch mit den finden von Dateien.

Ansosnsten kannst du im Pythonscript den Pfad so ändern:

Code: Alles auswählen

import os
os.chdir("d:/a/will/ich/hin")

neue frage, selbes thema

Verfasst: Dienstag 9. Februar 2010, 18:25
von mimu
Hallo Zusammen

nach Suche zu meinem Anliegen im Forum habe ich diesen Faden gefunden. Scheint mir der naheliegendste zu sein.

Ich habe Text-Dateien, die etwas über 100MB groß sind. Nun würde ich in einer Stapelverarbeitung gerne die ersten 5 Zeilen dieser Dateien ändern, ohne den Rest der Zeilen zu verlieren.

mit der option "w" bei f.open() wird ja der ganze Inhalt der Datei gelöscht.
mit der option "a" bei f.open kann man an das Ende der Datei anhängen.

Gibt es denn auch eine Option, um am Anfang der Datei etwas einzufügen ?

Bzw. fällt euch eine andere Möglichkeit ein ?

Muss doch möglich sein, dies über Python zu realisieren..

LG,
Mimu

Verfasst: Dienstag 9. Februar 2010, 18:37
von Dav1d
Soweit ich weiß musst du die Datei einlesen, dann bearbeiten und dann wiede rneu schreiben

Verfasst: Dienstag 9. Februar 2010, 18:38
von Dav1d
Auf was antworte ich da?

15.April 2005?

Verfasst: Dienstag 9. Februar 2010, 18:40
von mimu
Hi David,

danke für die Antwort.

Mein Post ist schon neuer als 2005, ist ne neue Frage zum alten Thema..

Ich habe Tausende dieser 100 MB großen Textdateien, jeweils die komplette Datie zu schreiben ist ein wahnsinniger Rechenaufwand..

Ich hoffe es gibt eine andere Lösung..

LG,
Mimu

Verfasst: Dienstag 9. Februar 2010, 18:51
von Milan
Hi! omg... hab so eben eine Antwortbenachrichtigung per email erhalten, das ist ja schon ewig her.

Wenn du einfluss auf das Design der Daten hast, lege es so, dass die 5 Zeilen am Ende der Datei sind. Dann kannst du die Datei mit "r+b" im binären Updatemodus öffnen und mit seek, tell und truncate arbeiten. Hierbei musst du nur noch die letzten 5 Zeilen finden und an den Start springen. Anschließend den Rest mit truncate abschneiden und neu hineinschreiben.

Wenn du keinen Einfluss darauf hast, hast du ein Problem. Dann kannst du zwar auch mit dem Updatemodus öffnen, aber der überschreibt dann nur Daten. Du kannst das also nur anwenden, wenn du Zeichen 1 : 1 ersetzt, damit nach den 5 Zeilen noch alles stimmt und die 5 Zeilen weg sind.

Ansonsten... auslesen, ändern, neu erstellen :(

mfG Milan

Verfasst: Dienstag 9. Februar 2010, 20:39
von snafu
mimu hat geschrieben:Mein Post ist schon neuer als 2005, ist ne neue Frage zum alten Thema..
Dafür einen antiken Thread rauszukramen macht eigentlich keinen so guten Eindruck. Besser wäre es, wenn du für deine Fragen eigene Threads eröffnest.

Verfasst: Dienstag 9. Februar 2010, 21:02
von Gabelmensch
Zumindest hat die mimu irgendeine Art von Suchmaschine verwendet, das ist schonmal was. :)

Verfasst: Mittwoch 10. Februar 2010, 16:06
von mimu
Danke für die Antworten.
Vor allem an Milan, die hilft mir nämlich tatsächlich weiter ;)

Werde das mal ausprobieren mit dem Updatemodus, bin aber nicht unbedingt guter Dinge, da ich im westenlich aus den ersten Zeilen Zeichen löschen muss, nicht ersetzen..

Ansonsten werde ich mir wohl ne andere Lösung suchen müssen.

Lg,
Der Mimu

PS: werde in Zukunft dann einen neuen Faden eröffnen.. Hätte ich dies gleich gemacht, hätte es bestimmt geheissen: Suchmaschine benutzen :roll: Irgendwas ist ja immer ;)

Verfasst: Donnerstag 11. Februar 2010, 17:52
von noisefloor
Hallo,

du könntest auch die Datei in eine Liste von Strings zeilenweise einlesen, dann kannst du rel. einfach auf jeden beliebige Zeile zugreifen.

Ob das bei 100 MB aber performant oder gar elegant ist...

Gruß, noisefloor

Verfasst: Montag 15. Februar 2010, 16:12
von mimu
Hallo zusammen,

danke für die Lösungsversuche.. Python scheint dazu eher ungeeignet zu sein.

Habe mich jetz dazu entschieden, dass Ganze über ein shell script in einer Linux-Umgebung zu lösen.

Lg,
Mimu

Verfasst: Montag 15. Februar 2010, 17:37
von Hyperion
mimu hat geschrieben: Habe mich jetz dazu entschieden, dass Ganze über ein shell script in einer Linux-Umgebung zu lösen.
Nur so aus Interesse. Könntest Du Deinen Ansatz dazu dennoch hier posten? (Oder halt in ein pastebin a la paste.pocoo.org)

Verfasst: Montag 15. Februar 2010, 18:35
von Dav1d
Aber in einen neuen Thread

Verfasst: Montag 15. Februar 2010, 18:47
von Hyperion
Dav1d hat geschrieben:Aber in einen neuen Thread
Hehe... jaja, der ist ja wirklich schon mumifiziert!