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 istbytesstattstr.
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:
os.listdir()– gibt eine Liste der Namen in einem Verzeichnis zurück.os.remove()– löscht eine Datei.os.rename()– benennt eine Datei um.os.stat()– Dateimetadaten (Größe, Änderungszeit, …).os.mkdir()– erstellt ein neues Verzeichnis.
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.