Python-Dateiverarbeitung: Ein umfassender Leitfaden
Python-Dateiverarbeitung: Dateien in verschiedenen Modi öffnen, Daten lesen und schreiben, pathlib nutzen und Fehler sicher behandeln.
Die Dateiverarbeitung ermöglicht es Ihren Programmen, Daten dauerhaft zu speichern und später wieder abzurufen. Dieses Kapitel erklärt alle gängigen Dateioperationen in Python — Dateien in verschiedenen Modi öffnen, Daten lesen und schreiben, innerhalb einer Datei navigieren, die Zeichenkodierung festlegen und Fehler behandeln, die im echten Code auftreten.
Die Funktion open()
Jede Dateioperation in Python beginnt mit open(). Sie gibt ein Dateiobjekt zurück, das Methoden zum Lesen, Schreiben und Positionieren innerhalb der Datei bereitstellt.
file_object = open(file, mode="r", encoding=None)file— der Pfad zur Datei (ein string oder einpathlib.Path-Objekt).mode— wie die Datei geöffnet werden soll (siehe Tabelle unten).encoding— die Textkodierung, z. B."utf-8". Geben Sie diese für Textdateien immer an, damit Ihr Code auf jedem Betriebssystem identisch funktioniert.
Dateimodi
| Modus | Bedeutung | Erstellt Datei? | Leert vorhandene Datei? |
|---|---|---|---|
"r" | Lesen (Standard) | Nein | Nein |
"w" | Schreiben | Ja | Ja |
"a" | Anhängen | Ja | Nein |
"x" | Exklusive Erstellung | Schlägt fehl, wenn Datei existiert | — |
"r+" | Lesen und Schreiben | Nein | Nein |
"b" | Binär (mit obigen kombinieren, z. B. "rb") | — | — |
"t" | Text (Standard, mit obigen kombinieren, z. B. "rt") | — | — |
Dateien immer mit with öffnen
Die with-Anweisung (ein Kontextmanager) stellt sicher, dass die Datei beim Verlassen des Blocks geschlossen wird — auch wenn eine Ausnahme ausgelöst wird. Dies verhindert Ressourcenlecks und stellt sicher, dass gepufferte Schreibvorgänge auf die Festplatte übertragen werden.
Eine Datei sicher mit with öffnen
with open("notes.txt", "r", encoding="utf-8") as f:
contents = f.read()
# File is automatically closed hereopen() ohne with aufzurufen und file.close() zu vergessen, ist eine häufige Ursache für Datenbeschädigungen und „too many open files"-Fehler in lang laufenden Programmen.
Dateien lesen
Python bietet mehrere Möglichkeiten, den Inhalt einer Datei zu lesen.
Die gesamte Datei mit read() lesen
read() gibt den vollständigen Dateiinhalt als einzelnen string zurück.
Eine gesamte Datei lesen
with open("notes.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)Bei großen Dateien wird damit alles auf einmal in den Speicher geladen, was für kleine Dateien in Ordnung ist, aber für mehrgigabyte-große Protokolldateien ineffizient ist.
Eine feste Anzahl von Zeichen lesen
Übergeben Sie eine ganze Zahl an read(n), um höchstens n Zeichen zu lesen.
Die ersten 20 Zeichen lesen
with open("notes.txt", "r", encoding="utf-8") as f:
chunk = f.read(20)
print(repr(chunk))Eine Zeile nach der anderen mit readline() lesen
readline() gibt die nächste Zeile einschließlich des abschließenden \n zurück, oder einen leeren string am Dateiende.
Eine Datei Zeile für Zeile mit readline() lesen
with open("notes.txt", "r", encoding="utf-8") as f:
line = f.readline()
while line:
print(line, end="") # line already contains '\n'
line = f.readline()Über Zeilen iterieren (am pythonischsten)
Direkt über ein Dateiobjekt zu iterieren ist der speichereffizienteste Ansatz zum zeilenweisen Lesen.
Über Zeilen iterieren
with open("notes.txt", "r", encoding="utf-8") as f:
for line in f:
print(line, end="")Alle Zeilen mit readlines() in eine Liste einlesen
readlines() gibt eine Liste zurück, bei der jedes Element eine Zeile ist (mit dem Zeilenumbruchzeichen).
Alle Zeilen in eine Liste einlesen
with open("notes.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
print(lines[0]) # first line
print(len(lines)) # total number of linesVerwenden Sie readlines(), wenn Sie wahlfreien Zugriff auf bestimmte Zeilen per Index benötigen. Für die sequentielle Verarbeitung bevorzugen Sie das Muster for line in f.
Dateien schreiben
Schreibmodus ("w")
Der Schreibmodus erstellt die Datei, wenn sie nicht existiert, und leert (bereinigt) sie, wenn sie bereits vorhanden ist.
Text in eine Datei schreiben
with open("output.txt", "w", encoding="utf-8") as f:
f.write("Line one\n")
f.write("Line two\n")Mehrere Zeilen mit writelines() schreiben
writelines() akzeptiert ein iterierbares Objekt aus strings. Es fügt keine Zeilenumbruchzeichen automatisch hinzu.
Eine Liste von Zeilen schreiben
lines = ["apple\n", "banana\n", "cherry\n"]
with open("fruits.txt", "w", encoding="utf-8") as f:
f.writelines(lines)Anhängemodus ("a")
Der Anhängemodus verschiebt die Schreibposition vor jedem Schreibvorgang ans Ende der Datei, sodass vorhandener Inhalt nie überschrieben wird.
Einen Protokolleintrag anhängen
import datetime
entry = f"{datetime.date.today()} — task complete\n"
with open("log.txt", "a", encoding="utf-8") as f:
f.write(entry)Jedes Mal, wenn dieses Skript ausgeführt wird, fügt es eine neue Zeile zu log.txt hinzu, ohne vorherige Einträge zu verändern.
Modus zur exklusiven Erstellung ("x")
Verwenden Sie "x", wenn Sie eine neue Datei erstellen und sicherstellen möchten, dass Sie keine vorhandene Datei überschreiben. Python löst FileExistsError aus, wenn die Datei bereits existiert.
Eine Datei nur dann erstellen, wenn sie nicht existiert
try:
with open("config.txt", "x", encoding="utf-8") as f:
f.write("[settings]\n")
except FileExistsError:
print("config.txt already exists — not overwriting.")Dateipositionen: seek() und tell()
Dateiobjekte pflegen einen internen Positionszeiger, der beim Lesen oder Schreiben voranschreitet. Sie können diesen Zeiger inspizieren und verändern.
tell()— gibt die aktuelle Byte-Position zurück.seek(offset, whence=0)— verschiebt den Zeiger.whence=0(Standard) ist vom Anfang,1ist von der aktuellen Position,2ist vom Ende.
Mit seek(0) zum Anfang zurückspringen
with open("notes.txt", "r", encoding="utf-8") as f:
first_pass = f.read()
f.seek(0) # go back to the start
second_pass = f.read()
print(first_pass == second_pass) # Trueseek() ist besonders nützlich im Modus "r+" (Lesen und Schreiben), wo Sie einen Abschnitt lesen und ihn dann im selben geöffneten Aufruf überschreiben können.
Mit Binärdateien arbeiten
Öffnen Sie eine Datei im Binärmodus, indem Sie "b" zum Modusstring hinzufügen ("rb", "wb", "ab"). Der Binärmodus liefert rohe Bytes statt strings, was für Bilder, Audio, komprimierte Archive und andere Nicht-Textdaten unverzichtbar ist.
Eine Datei im Binärmodus kopieren
with open("photo.jpg", "rb") as src:
data = src.read()
with open("photo_backup.jpg", "wb") as dst:
dst.write(data)Geben Sie kein encoding an, wenn Sie den Binärmodus verwenden — Python löst einen ValueError aus, wenn Sie es versuchen.
Fehlerbehandlung
Dateioperationen können auf vorhersehbare Weise fehlschlagen. Das Einbetten in try/except-Blöcke macht Ihre Skripte robuster.
Häufige Dateifehler behandeln
try:
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read()
except FileNotFoundError:
print("Error: the file does not exist.")
except PermissionError:
print("Error: you do not have permission to read this file.")
except OSError as e:
print(f"OS error: {e}")Häufige Ausnahmen, denen Sie begegnen werden:
| Ausnahme | Wann sie auftritt |
|---|---|
FileNotFoundError | Lesen einer Datei, die nicht existiert |
FileExistsError | Erstellen einer Datei mit "x"-Modus, wenn sie bereits existiert |
PermissionError | Fehlende Lese-/Schreibberechtigung |
IsADirectoryError | Versuch, ein Verzeichnis als Datei zu öffnen |
UnicodeDecodeError | Datei-Bytes stimmen nicht mit der angegebenen Kodierung überein |
Die moderne pathlib-Alternative
Python 3.4 führte pathlib.Path ein, einen objektorientierten Ansatz für Dateisystempfade. Path-Objekte funktionieren nahtlos mit open() und bieten außerdem ihre eigenen Komfortmethoden read_text() / write_text().
Eine Datei mit pathlib lesen
from pathlib import Path
content = Path("notes.txt").read_text(encoding="utf-8")
print(content)Eine Datei mit pathlib schreiben
from pathlib import Path
Path("output.txt").write_text("Hello, world!\n", encoding="utf-8")read_text() und write_text() öffnen und schließen die Datei für Sie und machen einmalige Lese- und Schreibvorgänge sehr prägnant. Verwenden Sie open() mit einem with-Block, wenn Sie mehr Kontrolle benötigen — zum Beispiel beim blockweisen Lesen einer Datei oder bei der Verwendung von seek().
Dateien umbenennen und verschieben
Um eine Datei umzubenennen oder zu verschieben, verwenden Sie os.rename() für eine Umbenennung im selben Dateisystem oder shutil.move(), wenn Sie über Dateisysteme hinweg verschieben müssen.
Eine Datei mit os.rename() umbenennen
import os
os.rename("old_name.txt", "new_name.txt")Eine Datei mit shutil.move() verschieben
import shutil
shutil.move("report.txt", "archive/report.txt")shutil.move() funktioniert auch, wenn Quelle und Ziel auf verschiedenen Laufwerken liegen; os.rename() löst in diesem Fall einen OSError aus.
Überprüfen, ob eine Datei existiert
Bevor Sie eine Datei zum Lesen öffnen, möchten Sie vielleicht bestätigen, dass sie existiert. Verwenden Sie os.path.exists() oder das pathlib-Äquivalent.
Existenz mit os.path prüfen
import os
if os.path.exists("data.txt"):
print("File found.")
else:
print("File not found.")Existenz mit pathlib prüfen
from pathlib import Path
p = Path("data.txt")
if p.exists():
print("File found.")Beachten Sie, dass os.path.exists() und Path.exists() in mehrfädigen oder mehrprozessigen Programmen veraltete Ergebnisse zurückgeben können. In diesen Fällen ist es besser, einfach die Datei mit open() zu öffnen und FileNotFoundError abzufangen.
Übersicht der wichtigsten Funktionen
| Operation | os / shutil-Ansatz | pathlib-Ansatz |
|---|---|---|
| Öffnen und lesen | open(path, "r") | Path(path).read_text() |
| Öffnen und schreiben | open(path, "w") | Path(path).write_text() |
| Existenz prüfen | os.path.exists(path) | Path(path).exists() |
| Umbenennen | os.rename(src, dst) | Path(src).rename(dst) |
| Verschieben | shutil.move(src, dst) | Path(src).rename(dst) (gleich. FS) |
| Löschen | os.remove(path) | Path(path).unlink() |
Verwandte Kapitel
- Python-Dateien lesen — ausführliche Betrachtung aller Lesetechniken
- Python-Dateien schreiben/erstellen — Schreiben, Erstellen und bewährte Methoden
- Python-Dateien löschen — Dateien und Verzeichnisse sicher löschen
- Python Try Except — Ausnahmen in Python behandeln
- Python With Statement — wie Kontextmanager funktionieren