Frage zum Öffnen und Schreiben von Textdateien

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
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

Hallo zusammen,

Textdateien sind ja sehr einfach zu verwenden, trotzdem hätte ich ein paar Fragen dazu:

Beim Öffnen gebe ich einen Modus an:

Code: Alles auswählen

datei = open('Dateiname', 'modus')  # Ich schreib hier einmal modus statt r oder w oder a oder r+
Wenn ich mit 'w' öffne, kann ich schreiben. Wenn ich mit 'r+' öffne, kann ich lesen und schreiben, allerdings schreibt Python alles immer am Ende der Datei dazu.
Das führt dazu, dass ich - wenn ich was ändern will in der Datei - zuerst lesend mit 'r' öffnen muss ('r' kann man auch weglassen), und dann den geänderten Inhalt mit 'w' zurückschreibe.
Jedesmal muss ich jedoch ein open() und ein close() absetzen, weil ich befürchte, dass mir die Datei-Handles überlaufen, wenn ich die Datei nicht jedesmal schließe.

Code: Alles auswählen

datei = open('Testdatei.txt')
...lesen...
datei.close()
...irgendwas am Inhalt ändern = neuer Inhalt
datei = open('Testdatei.txt', 'w')
datei.write(neuer Inhalt)
datei.close()
Mir kommt das eher umständlich vor. Wenn 'r+' den Inhalt der Datei überschreiben könnte, wäre es für mich praktischer. Kann man nicht irgendwie angeben, ab welcher Position in der Datei man schreiben möchte? Hab im Guugl leider nichts gefunden.

Danke.
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

r+ schreibt an der aktuellen Position, da Du die Datei komplett liest, ist die aktuelle Position am Ende der Datei. Aber r+ ist sowieso für Text-Dateien unsinnig. Textdateien muß man im Normalfall sowieso komplett neu schreiben.
Dateien öffnet man immer innerhalb eines with-Statements.

Code: Alles auswählen

with open('Testdatei.txt', encoding="utf8") as datei:
    ....
with open('Testdatei.txt', 'w', encoding='utf8') as datei:
    datei.write(text)
Zuletzt geändert von Sirius3 am Mittwoch 13. Januar 2021, 21:07, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Um deiner Sorge zu begegnen, gibt es das with-statement, mit dem man sicherstellt, dass eine geöffnete Datei auch immer geschlossen wird.

Zu deiner Frage: man kann natürlich mit seek arbeiten. Faktisch ist das aber nur sinnvoll, wenn man garantiert immer Daten gleicher Länge hat. Was bei Texten mit Zeilen tendenziell nicht der Fall ist. In dem Fall kommt man um einen Austausch des gesamten Inhaltes nicht herum.
Benutzeravatar
Dennis89
User
Beiträge: 1538
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

du brauchst die Datei nicht jedes mal schliessen, wenn du sie mit 'with' öffnest.

Code: Alles auswählen

with open(filename, 'r') as file:
    #do_something_with_file
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
narpfel
User
Beiträge: 690
Registriert: Freitag 20. Oktober 2017, 16:10

Wenn man den gesamten Text liest und die Datei nicht Zeile für Zeile verarbeiten will, gibt es auch noch `pathlib.Path.read_text` und `pathlib.Path.write_text`.
WalterT
User
Beiträge: 31
Registriert: Dienstag 5. Dezember 2017, 16:00

That's it !! Vielen Dank an alle und lg
Walter
Antworten