2.27. Lesen und Schreiben

Dateien befinden sich auf der Festplatte; Python greift über open() auf sie zu, das ein Dateiobjekt zurückgibt, dessen Methoden die zugrunde liegenden Bytes lesen und schreiben.

2.27.1. open und Modi

Das erste Argument ist der Pfad; das zweite ist der Modus – ein kurzer String, der Python mitteilt, wie die Datei verwendet wird:

  • "r" – Lesen (Standard). Öffnet eine vorhandene Datei zum Lesen.

  • "w" – Schreiben. Erstellt eine neue Datei oder kürzt eine vorhandene auf leer.

  • "a" – Anhängen. Öffnet eine Datei zum Schreiben an ihrem Ende, ohne sie zu kürzen.

  • "b", an eines der obigen angehängt ("rb", "wb", "ab") – Binärmodus. Der Inhalt der Datei ist bytes statt str.

f = open("notes.txt", "r")
text = f.read()
f.close()

2.27.2. Verwenden Sie einen Kontextmanager

Das obige Muster lässt das Datei-Handle leck schlagen, wenn irgendetwas zwischen open() und close eine Ausnahme auslöst. Die Lösung ist die with-Anweisung (siehe Kontextmanager):

with open("notes.txt") as f:
    text = f.read()

# f is closed here, even if read() failed

Dies ist die Standardform – schreiben Sie es jedes Mal auf diese Weise.

2.27.3. Lesen

Dateiobjekte unterstützen mehrere Lesestile:

  • io.IOBase.read() – liest die gesamte Datei (oder N Bytes) und gibt sie als einen einzigen String (oder ein Bytes-Objekt) zurück.

  • io.IOBase.readline() – liest eine Zeile, einschließlich des abschließenden "\n".

  • Das direkte Iterieren über die Datei liefert die Zeilen eine nach der anderen, mit deutlich geringerem Speicherverbrauch als das Lesen der gesamten Datei auf einmal.

with open("log.txt") as f:
    for line in f:
        print(line.rstrip())

str.rstrip() entfernt den abschließenden Zeilenumbruch vor dem Ausgeben, damit die Ausgabe nicht doppelt zeilengeschaltet ist.

2.27.4. Schreiben

Öffnen Sie die Datei im Modus "w" und verwenden Sie io.IOBase.write():

with open("out.txt", "w") as f:
    f.write("hello\n")
    f.write("world\n")

io.IOBase.write() fügt keinen Zeilenumbruch hinzu – es schreibt genau die Bytes (oder Zeichen, im Textmodus), die Sie ihm geben.

2.27.5. Text vs. Binär

Der Textmodus (Standard, "r" / "w" ohne "b") dekodiert eingehende Bytes mit einer Standardkodierung in str und kodiert ausgehende str zurück in Bytes. Verwenden Sie ihn für Konfiguration, Logs, JSON – alles, das Text ist.

Der Binärmodus ("rb" / "wb") überspringt den Dekodierungsschritt und gibt bytes zurück. Verwenden Sie ihn für Bilder, struct-gepackte Datensätze, Netzwerkmitschnitte – alles, bei dem jedes Byte zählt und die Datei nicht menschenlesbar ist.

2.27.6. Dateien auflisten und entfernen

Das Modul os stellt die Dateisystemoperationen bereit, die sich nicht am Dateiobjekt selbst befinden:

import os

for name in os.listdir("/"):
    print(name)

Fangen Sie OSError rund um diese ab, wenn die Datei oder das Verzeichnis möglicherweise nicht vorhanden ist – die Operation ist einer der häufigen Orte, an denen in echten Skripten Ausnahmen auftauchen.