W3docs

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 ein pathlib.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

ModusBedeutungErstellt Datei?Leert vorhandene Datei?
"r"Lesen (Standard)NeinNein
"w"SchreibenJaJa
"a"AnhängenJaNein
"x"Exklusive ErstellungSchlägt fehl, wenn Datei existiert
"r+"Lesen und SchreibenNeinNein
"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 here

open() 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 lines

Verwenden 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, 1 ist von der aktuellen Position, 2 ist 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)  # True

seek() 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:

AusnahmeWann sie auftritt
FileNotFoundErrorLesen einer Datei, die nicht existiert
FileExistsErrorErstellen einer Datei mit "x"-Modus, wenn sie bereits existiert
PermissionErrorFehlende Lese-/Schreibberechtigung
IsADirectoryErrorVersuch, ein Verzeichnis als Datei zu öffnen
UnicodeDecodeErrorDatei-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

Operationos / shutil-Ansatzpathlib-Ansatz
Öffnen und lesenopen(path, "r")Path(path).read_text()
Öffnen und schreibenopen(path, "w")Path(path).write_text()
Existenz prüfenos.path.exists(path)Path(path).exists()
Umbenennenos.rename(src, dst)Path(src).rename(dst)
Verschiebenshutil.move(src, dst)Path(src).rename(dst) (gleich. FS)
Löschenos.remove(path)Path(path).unlink()

Verwandte Kapitel

Was this page helpful?