Textdateien bearbeiten

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
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
Benutzeravatar
strogon14
User
Beiträge: 58
Registriert: Sonntag 23. Februar 2003, 19:34
Wohnort: Köln
Kontaktdaten:

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?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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 ;) :)
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.
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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")
mimu
User
Beiträge: 6
Registriert: Dienstag 9. Februar 2010, 18:18

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
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Soweit ich weiß musst du die Datei einlesen, dann bearbeiten und dann wiede rneu schreiben
the more they change the more they stay the same
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Auf was antworte ich da?

15.April 2005?
the more they change the more they stay the same
mimu
User
Beiträge: 6
Registriert: Dienstag 9. Februar 2010, 18:18

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
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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

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.
Gabelmensch
User
Beiträge: 79
Registriert: Montag 12. Oktober 2009, 11:50

Zumindest hat die mimu irgendeine Art von Suchmaschine verwendet, das ist schonmal was. :)
mimu
User
Beiträge: 6
Registriert: Dienstag 9. Februar 2010, 18:18

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 ;)
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
mimu
User
Beiträge: 6
Registriert: Dienstag 9. Februar 2010, 18:18

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

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)
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Aber in einen neuen Thread
the more they change the more they stay the same
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dav1d hat geschrieben:Aber in einen neuen Thread
Hehe... jaja, der ist ja wirklich schon mumifiziert!
Antworten