Python & AI Tutorials Logo
Python Programmierung

27. Aus Dateien lesen und in Dateien schreiben

Bis jetzt waren alle Daten in unseren Programmen temporär – gespeichert in Variablen, die verschwinden, wenn das Programm endet. Um Programme zu erstellen, die Informationen zwischen Ausführungen behalten, müssen wir mit Dateien arbeiten. Dateien ermöglichen es uns, Daten auf die Festplatte zu speichern und sie später wieder zu lesen – das macht alles möglich, von Konfigurationseinstellungen bis hin zur Speicherung von Benutzerdaten.

In diesem Kapitel lernen Sie, wie Sie in Python aus Textdateien lesen und in Textdateien schreiben. Wir beginnen damit, Dateipfade zu verstehen und wie Python Dateien findet, und gehen dann weiter über das Öffnen, Lesen, Schreiben und korrekte Schließen von Dateien. Sie lernen verschiedene Dateimodi, Text-Encoding und wie Sie häufige Fehler behandeln, die bei Dateioperationen auftreten.

27.1) Dateipfade und das aktuelle Arbeitsverzeichnis

Bevor wir mit Dateien arbeiten können, müssen wir verstehen, wie Python sie im Dateisystem Ihres Computers findet.

27.1.1) Dateipfade verstehen

Ein Dateipfad (file path) ist die Adresse einer Datei auf Ihrem Computer. Er sagt Python ganz genau, wo eine Datei zu finden ist. Es gibt zwei Arten von Pfaden:

Absolute Pfade geben den vollständigen Speicherort ab dem Wurzelverzeichnis des Dateisystems an:

  • Windows: C:\Users\Alice\Documents\data.txt
  • macOS/Linux: /home/alice/documents/data.txt

Relative Pfade geben einen Speicherort relativ zum aktuellen Arbeitsverzeichnis an:

  • data.txt (Datei im aktuellen Verzeichnis)
  • reports/sales.txt (Datei in einem Unterverzeichnis)
  • ../config.txt (Datei im übergeordneten Verzeichnis)

Das aktuelle Arbeitsverzeichnis (current working directory, CWD) ist der Ordner, in dem Python nach Dateien sucht, wenn Sie relative Pfade verwenden. Wenn Sie ein Python-Skript ausführen, ist das CWD das Verzeichnis, aus dem Sie den Befehl ausgeführt haben, nicht unbedingt das, in dem die Skriptdatei liegt.

Zum Beispiel:

bash
# Directory structure:
/home/alice/
  └── projects/
      └── script.py
 
# Running from the projects folder:
$ cd /home/alice/projects
$ python script.py
# CWD is /home/alice/projects
 
# Running from the parent folder:
$ cd /home/alice
$ python projects/script.py
# CWD is /home/alice (not where script.py is!)

Sie können das aktuelle Arbeitsverzeichnis prüfen mit:

python
import os
 
# Das aktuelle Arbeitsverzeichnis abrufen
current_dir = os.getcwd()
print(f"Current directory: {current_dir}")

Output:

Current directory: /home/alice/projects/file_demo

Die Funktion os.getcwd() gibt den absoluten Pfad des aktuellen Arbeitsverzeichnisses zurück. Das ist hilfreich, um zu verstehen, wo Python nach Dateien sucht, wenn Sie relative Pfade verwenden.

Das aktuelle Arbeitsverzeichnis zu verstehen ist wichtig, weil es bestimmt, wo Python sucht, wenn Sie einen relativen Pfad wie "data.txt" verwenden. Wenn Sie Ihr Skript aus /home/alice/projects/ ausführen und "data.txt" öffnen, sucht Python nach /home/alice/projects/data.txt.

27.1.2) Relative Pfade effektiv verwenden

Wenn Sie mit Dateien arbeiten, sind relative Pfade oft praktischer als absolute Pfade, weil sie Ihren Code portabel machen – er funktioniert unabhängig davon, wo der Projektordner auf verschiedenen Computern liegt.

Hier sind gängige Muster für relative Pfade:

python
# Datei im aktuellen Arbeitsverzeichnis
filename = "student_grades.txt"
 
# Datei in einem Unterverzeichnis (data-Ordner innerhalb des aktuellen Verzeichnisses)
filename = "data/student_grades.txt"
 
# Datei im übergeordneten Verzeichnis
filename = "../shared_data.txt"

Für die Beispiele dieses Kapitels verwenden wir hauptsächlich einfache Dateinamen wie "data.txt". Das bedeutet:

  • Die Datendateien sollten sich im selben Verzeichnis befinden, aus dem Sie den Python-Befehl ausführen
  • Wenn Ihr Skript in /home/alice/projects/ liegt und Sie python script.py aus diesem Verzeichnis ausführen, sucht Python nach data.txt in /home/alice/projects/

Dieser Ansatz hält die Beispiele klar und konzentriert sich auf Dateioperationen statt auf Pfadnavigation. Wenn Sie eine FileNotFoundError erhalten, verwenden Sie os.getcwd(), um zu prüfen, wo Python nach Dateien sucht.

27.1.3) Pfadtrenner in verschiedenen Betriebssystemen

Verschiedene Betriebssysteme verwenden unterschiedliche Zeichen, um Verzeichnisse in Pfaden zu trennen:

  • Windows verwendet Backslashes: data\reports\sales.txt
  • macOS und Linux verwenden Forward Slashes: data/reports/sales.txt

Python handhabt das automatisch, wenn Sie in Ihrem Code Forward Slashes verwenden – sie funktionieren auf allen Betriebssystemen:

python
# Das funktioniert unter Windows, macOS und Linux
filename = "data/reports/sales.txt"

Python konvertiert die Forward Slashes in den passenden Trenner für Ihr Betriebssystem.

27.2) Dateien öffnen und schließen

Um mit einer Datei zu arbeiten, müssen wir sie zuerst öffnen (open), wodurch eine Verbindung zwischen unserem Programm und der Datei auf der Festplatte entsteht. Wenn wir fertig sind, müssen wir sie schließen (close), um Systemressourcen freizugeben und sicherzustellen, dass alle Daten korrekt gespeichert werden.

27.2.1) Die Funktion open()

Die Funktion open() erzeugt ein Dateiobjekt (file object), das die Verbindung zu einer Datei repräsentiert. In der einfachsten Form geben Sie den Dateinamen an:

python
# Eine Datei zum Lesen öffnen (der Standardmodus)
file = open("message.txt")

Das öffnet die Datei message.txt im aktuellen Verzeichnis. Die Funktion open() gibt ein Dateiobjekt zurück, das wir in der Variablen file speichern. Dieses Objekt stellt Methoden zum Lesen aus oder Schreiben in die Datei bereit.

Allerdings hat dieser grundlegende Ansatz ein kritisches Problem: Wenn nach dem Öffnen der Datei ein Fehler auftritt, wird die Datei möglicherweise nie geschlossen. Sehen wir uns an, warum das Schließen von Dateien wichtig ist.

27.2.2) Warum das Schließen von Dateien wichtig ist

Wenn Sie eine Datei öffnen, reserviert das Betriebssystem Ressourcen, um diese Verbindung aufrechtzuerhalten. Wenn Sie die Datei nicht schließen:

  • Daten werden möglicherweise nicht gespeichert: Beim Schreiben in Dateien werden Daten oft im Speicher gepuffert und erst beim Schließen der Datei auf die Festplatte geschrieben
  • Systemressourcen werden verschwendet: Jede offene Datei verbraucht Speicher und Dateihandles
  • Andere Programme könnten blockiert werden: Manche Systeme verhindern, dass andere Programme auf eine Datei zugreifen, die bereits geöffnet ist

Um eine Datei zu schließen, rufen Sie ihre Methode close() auf:

python
file = open("message.txt")
# ... mit der Datei arbeiten ...
file.close()  # Ressourcen freigeben und sicherstellen, dass Daten gespeichert werden

27.2.3) Das Problem beim manuellen Schließen

Dateien manuell zu schließen ist fehleranfällig. Wenn zwischen Öffnen und Schließen eine Exception auftritt, wird der Aufruf von close() möglicherweise nie ausgeführt:

python
file = open("data.txt")
result = process_data(file)  # Wenn das eine Exception auslöst...
file.close()  # ...läuft das nie!

Das ist ein so häufiges Problem, dass Python eine bessere Lösung bietet: die with-Anweisung, die wir in Abschnitt 27.4 kennenlernen. Für jetzt ist wichtig: Dateien manuell zu öffnen und zu schließen erfordert sorgfältige Aufmerksamkeit, damit close() immer aufgerufen wird.

27.2.4) Prüfen, ob eine Datei geöffnet ist

Ein Dateiobjekt hat ein Attribut closed, das Ihnen sagt, ob die Datei geschlossen ist:

python
file = open("data.txt")
print(file.closed)  # Output: False
 
file.close()
print(file.closed)  # Output: True

Sobald eine Datei geschlossen ist, führt der Versuch, aus ihr zu lesen oder in sie zu schreiben, zu einem Fehler:

python
file = open("data.txt")
file.close()
 
# This raises ValueError: I/O operation on closed file
content = file.read()

Die Fehlermeldung zeigt das Problem klar: Sie versuchen, eine I/O-Operation (Input/Output) auf einer Datei auszuführen, die bereits geschlossen ist.

27.3) Dateimodi (r, w, a, Text vs. Binär) und Encoding verstehen

Beim Öffnen einer Datei können Sie einen Modus (mode) angeben, der bestimmt, welche Operationen erlaubt sind und wie die Datei behandelt wird. Modi zu verstehen ist entscheidend, um korrekt mit Dateien zu arbeiten.

27.3.1) Textmodus vs. Binärmodus

Dateien können in zwei grundlegenden Modi geöffnet werden:

Textmodus (text mode) (Standard) behandelt die Datei so, als enthalte sie Text. Python:

  • Konvertiert Zeilenenden unabhängig von der Plattform zu \n
  • Handhabt Text-Encoding (Konvertierung zwischen Bytes und Strings)
  • Erlaubt das Lesen und Schreiben von Strings

Binärmodus (binary mode) behandelt die Datei als rohe Bytes. Python:

  • Liest und schreibt Bytes-Objekte, nicht Strings
  • Nimmt keine Konvertierungen oder Interpretationen vor
  • Wird für Bilder, Audio, Video und andere Nicht-Text-Dateien verwendet

In diesem Kapitel konzentrieren wir uns auf den Textmodus, den Sie am häufigsten verwenden werden. Der Binärmodus wird angezeigt, indem Sie der Modus-Zeichenkette ein 'b' hinzufügen (wie 'rb' oder 'wb'), aber für Textdateien brauchen wir ihn nicht.

27.3.2) Die drei primären Dateimodi

Python bietet drei primäre Modi zum Öffnen von Textdateien:

Lesemodus ('r') – Öffnet eine Datei nur zum Lesen:

python
file = open("data.txt", "r")  # oder einfach open("data.txt")
  • Die Datei muss bereits existieren, sonst löst Python FileNotFoundError aus
  • Sie können aus der Datei lesen, aber nicht in sie schreiben
  • Das ist der Standardmodus, wenn Sie keinen angeben

Schreibmodus ('w') – Öffnet eine Datei zum Schreiben:

python
file = open("output.txt", "w")
  • Erstellt die Datei, wenn sie nicht existiert
  • Löscht den gesamten vorhandenen Inhalt, wenn die Datei bereits existiert
  • Sie können in die Datei schreiben, aber nicht aus ihr lesen
  • Verwenden Sie das, wenn Sie eine neue Datei erstellen oder eine vorhandene vollständig ersetzen möchten

Anhängen-Modus ('a') – Öffnet eine Datei zum Anhängen:

python
file = open("log.txt", "a")
  • Erstellt die Datei, wenn sie nicht existiert
  • Behält vorhandenen Inhalt bei und fügt neuen Inhalt am Ende hinzu
  • Sie können in die Datei schreiben, aber nicht aus ihr lesen
  • Verwenden Sie das, wenn Sie eine bestehende Datei erweitern möchten, ohne ihren aktuellen Inhalt zu verlieren

Hier ist ein Vergleich, wie sich diese Modi auf eine bestehende Datei auswirken:

python
# Angenommen, data.txt enthält: "Hello\nWorld\n"
 
# Lesemodus – Inhalt unverändert
file = open("data.txt", "r")
file.close()
# Datei enthält weiterhin: "Hello\nWorld\n"
 
# Schreibmodus – Inhalt gelöscht
file = open("data.txt", "w")
file.write("New content\n")
file.close()
# Datei enthält jetzt: "New content\n"
 
# Anhängen-Modus – Inhalt bleibt erhalten, neuer Inhalt wird hinzugefügt
file = open("data.txt", "a")
file.write("Added line\n")
file.close()
# Datei enthält jetzt: "New content\nAdded line\n"

27.3.3) Text-Encoding verstehen

Wenn Sie mit Textdateien arbeiten, muss Python wissen, wie es zwischen den auf der Festplatte gespeicherten Bytes und den String-Zeichen in Ihrem Programm konvertiert. Dieser Konvertierungsprozess heißt Encoding (encoding).

Das häufigste Encoding ist UTF-8, das jedes Zeichen aus jeder Sprache darstellen kann. Es ist das Standard-Encoding in Python 3 und der Standard für moderne Textdateien.

python
# UTF-8-Encoding explizit angeben (auch wenn es normalerweise der Standard ist)
file = open("data.txt", "r", encoding="utf-8")

Warum ist Encoding wichtig? Betrachten Sie diese Textdatei, die einen Namen mit einem akzentuierten Zeichen enthält:

python
# Eine Datei mit Sonderzeichen schreiben
file = open("names.txt", "w", encoding="utf-8")
file.write("José\n")
file.write("François\n")
file.write("Müller\n")
file.close()
 
# Wieder einlesen
file = open("names.txt", "r", encoding="utf-8")
content = file.read()
file.close()
print(content)

Output:

José
François
Müller

Wenn Sie versuchen, eine Datei mit dem falschen Encoding zu öffnen, sehen Sie möglicherweise verstümmelte Zeichen oder erhalten einen Fehler. Verwenden Sie für neue Dateien immer UTF-8, sofern Sie keinen spezifischen Grund haben, ein anderes Encoding zu nutzen.

27.3.4) Zusätzliche Modus-Varianten

Python bietet zusätzliche Moduszeichen, die mit den primären Modi kombiniert werden können:

Plus-Modi (plus modes) erlauben sowohl Lesen als auch Schreiben:

  • 'r+' – Lesen und Schreiben (Datei muss existieren)
  • 'w+' – Schreiben und Lesen (löscht vorhandenen Inhalt)
  • 'a+' – Anhängen und Lesen (behält vorhandenen Inhalt bei)

Für Anfänger ist es übersichtlicher, eine Datei einmal zum Lesen zu öffnen und separat zum Schreiben, statt Plus-Modi zu verwenden. In diesem Kapitel bleiben wir bei den einfachen Modi ('r', 'w', 'a').

Dateimodi

Lesen 'r'

Schreiben 'w'

Anhängen 'a'

Datei muss existieren
Nur lesen
Standardmodus

Erstellt bei Bedarf
Löscht vorhandenes
Nur schreiben

Erstellt bei Bedarf
Behält vorhandenes
Nur schreiben

27.4) with verwenden, um Dateien automatisch zu verwalten

Die with-Anweisung bietet eine sauberere, sicherere Möglichkeit, mit Dateien zu arbeiten. Sie schließt die Datei automatisch, wenn Sie fertig sind, selbst wenn ein Fehler auftritt.

27.4.1) Syntax der with-Anweisung

So verwenden Sie with, um eine Datei zu öffnen:

python
with open("data.txt", "r") as file:
    content = file.read()
    print(content)
# Die Datei wird hier automatisch geschlossen

Die Syntax hat mehrere Teile:

  • with – Keyword, das den Context Manager startet
  • open("data.txt", "r") – Öffnet die Datei
  • as file – Erzeugt eine Variable, um auf das Dateiobjekt zu verweisen
  • : – Beginnt den eingerückten Block
  • Eingerückter Block – Code, der mit der Datei arbeitet
  • Nach dem Block – Datei wird automatisch geschlossen

Der entscheidende Vorteil: Python garantiert, dass die Datei geschlossen wird, wenn der with-Block endet, unabhängig davon, wie er endet (normal, mit return oder aufgrund einer Exception).

27.4.2) Warum with besser ist als manuelles Schließen

Vergleichen Sie diese beiden Ansätze:

python
# Manuelles Schließen – riskant
file = open("data.txt", "r")
content = file.read()
result = process(content)  # Wenn das eine Exception auslöst...
file.close()  # ...läuft das nie
 
# with verwenden – sicher
with open("data.txt", "r") as file:
    content = file.read()
    result = process(content)  # Selbst wenn das eine Exception auslöst...
# ...wird die Datei trotzdem automatisch geschlossen

Die with-Anweisung verwendet Pythons Context-Manager-Protokoll (context manager protocol) (das wir in Kapitel 28 im Detail untersuchen). Für jetzt können Sie es als Garantie sehen: „Ich räume diese Ressource auf, wenn Sie fertig sind, egal was passiert.“

27.4.3) Mit mehreren Dateien arbeiten

Sie können mehrere Dateien in einer einzigen with-Anweisung öffnen:

python
with open("input.txt", "r") as infile, open("output.txt", "w") as outfile:
    content = infile.read()
    outfile.write(content.upper())
# Beide Dateien werden hier automatisch geschlossen

Das ist nützlich, wenn Sie gleichzeitig aus einer Datei lesen und in eine andere schreiben müssen. Beide Dateien werden garantiert korrekt geschlossen, selbst wenn ein Fehler auftritt.

27.4.4) Das Dateiobjekt ist nur innerhalb des with-Blocks gültig

Sobald der with-Block endet, ist die Datei geschlossen, und Sie können das Dateiobjekt nicht mehr verwenden:

python
with open("data.txt", "r") as file:
    content = file.read()
    print("Inside with block:", file.closed)  # Output: Inside with block: False
 
print("Outside with block:", file.closed)  # Output: Outside with block: True
 
# This raises ValueError: I/O operation on closed file
more_content = file.read()

Dieses Verhalten ist beabsichtigt – es verhindert, dass Sie versehentlich eine geschlossene Datei verwenden. Wenn Sie den Inhalt der Datei außerhalb des with-Blocks benötigen, speichern Sie ihn in einer Variablen (wie content oben), bevor der Block endet.

Ab diesem Punkt im Kapitel verwenden wir with für alle Dateioperationen. Das ist der empfohlene Ansatz und das, was Sie in Ihrem eigenen Code verwenden sollten.

27.5) Textdateien lesen

Jetzt, da wir verstanden haben, wie man Dateien sicher mit with öffnet, schauen wir uns die verschiedenen Möglichkeiten an, Inhalte aus Textdateien zu lesen.

27.5.1) Die gesamte Datei mit read() lesen

Die Methode read() liest den gesamten Dateiinhalt als einen einzigen String:

python
with open("message.txt", "r") as file:
    content = file.read()
    print(content)

Wenn message.txt enthält:

Welcome to Python!
This is a text file.
It has multiple lines.

Output:

Welcome to Python!
This is a text file.
It has multiple lines.

Die Methode read() enthält alle Newline-Zeichen (\n) aus der Datei. Wenn Sie den String ausgeben, zeigt Python aufgrund dieser Newline-Zeichen jede Zeile in einer eigenen Zeile an.

Sie können auch eine bestimmte Anzahl von Zeichen lesen, indem Sie eine Zahl an read() übergeben:

python
with open("message.txt", "r") as file:
    first_ten = file.read(10)  # Die ersten 10 Zeichen lesen
    print(f"First 10 characters: '{first_ten}'")

Output:

First 10 characters: 'Welcome to'

Die gesamte Datei zu lesen ist einfach und funktioniert gut für kleine Dateien. Für große Dateien (Megabytes oder Gigabytes) kann das Lesen von allem auf einmal jedoch zu viel Speicher verbrauchen. In solchen Fällen ist das zeilenweise Lesen effizienter.

27.5.2) Zeile für Zeile mit readline() lesen

Die Methode readline() liest eine einzelne Zeile aus der Datei, einschließlich des Newline-Zeichens am Ende:

python
with open("message.txt", "r") as file:
    line1 = file.readline()
    line2 = file.readline()
    line3 = file.readline()
    print(f"Line 1: {line1}")
    print(f"Line 2: {line2}")
    print(f"Line 3: {line3}")

Output:

Line 1: Welcome to Python!
 
Line 2: This is a text file.
 
Line 3: It has multiple lines.
 

Beachten Sie die zusätzlichen Leerzeilen in der Ausgabe. Jede aus der Datei gelesene Zeile endet mit \n, und print() fügt ein weiteres Newline hinzu. Um das zu vermeiden, verwenden Sie die Methode rstrip(), um nachfolgende Whitespaces zu entfernen:

python
with open("message.txt", "r") as file:
    line1 = file.readline().rstrip()
    line2 = file.readline().rstrip()
    print(f"Line 1: {line1}")
    print(f"Line 2: {line2}")

Output:

Line 1: Welcome to Python!
Line 2: This is a text file.

Wenn readline() das Ende der Datei erreicht, gibt es einen leeren String "" zurück. Damit können Sie erkennen, dass keine weiteren Zeilen zu lesen sind:

python
with open("message.txt", "r") as file:
    while True:
        line = file.readline()
        if line == "":  # Dateiende
            break
        print(line.rstrip())

Es gibt jedoch eine „pythonicere“ Möglichkeit, Dateien zeilenweise zu lesen.

27.5.3) Über Zeilen mit einer for-Schleife iterieren

Dateiobjekte sind iterierbar (iterable), was bedeutet, dass Sie direkt mit einer for-Schleife über sie iterieren können. Das ist die häufigste und Pythonicste Art, eine Datei zeilenweise zu lesen:

python
with open("message.txt", "r") as file:
    for line in file:
        print(line.rstrip())

Output:

Welcome to Python!
This is a text file.
It has multiple lines.

Dieser Ansatz ist:

  • Sauberer: Keine Notwendigkeit für readline() oder das Prüfen auf leere Strings
  • Effizienter: Python liest die Datei in Blöcken, statt die gesamte Datei in den Speicher zu laden
  • Pythonischer: Nutzt Iteration, was ein zentrales Python-Konzept ist

Jede Iteration der Schleife liest die nächste Zeile aus der Datei. Wenn es keine weiteren Zeilen gibt, endet die Schleife automatisch.

27.5.4) Alle Zeilen mit readlines() in eine Liste einlesen

Die Methode readlines() liest alle Zeilen aus der Datei und gibt sie als Liste von Strings zurück:

python
with open("message.txt", "r") as file:
    lines = file.readlines()
 
print(f"Number of lines: {len(lines)}")
for i, line in enumerate(lines, start=1):
    print(f"Line {i}: {line.rstrip()}")

Output:

Number of lines: 3
Line 1: Welcome to Python!
Line 2: This is a text file.
Line 3: It has multiple lines.

Jedes Element in der Liste ist ein String, der eine Zeile aus der Datei enthält, inklusive ihres Newline-Zeichens. Das ist nützlich, wenn Sie:

  • Auf Zeilen per Index zugreifen möchten: lines[0], lines[1], usw.
  • Zeilen mehrfach verarbeiten möchten
  • Die Gesamtzahl der Zeilen vor der Verarbeitung kennen müssen

Allerdings lädt readlines() wie read() die gesamte Datei in den Speicher. Für große Dateien ist das Iterieren mit einer for-Schleife speichereffizienter.

Lesemethoden

read

readline

for-Schleifen-Iteration

readlines

Ganze Datei als String
Einfach, aber speicherintensiv

Eine Zeile pro Aufruf
Manuelle Kontrolle

Eine Zeile pro Iteration
Am Pythonischsten

Alle Zeilen als Liste
Zufälliger Zugriff

27.6) In Textdateien schreiben und an Textdateien anhängen

In Dateien zu schreiben ist genauso wichtig wie aus ihnen zu lesen. Python bietet einfache Methoden, um neue Dateien zu erstellen oder bestehende zu verändern.

27.6.1) Mit write() in eine Datei schreiben

Um in eine Datei zu schreiben, öffnen Sie sie im Schreibmodus ('w') und verwenden die Methode write():

python
with open("output.txt", "w") as file:
    file.write("Hello, World!\n")
    file.write("This is a new file.\n")

Nach dem Ausführen dieses Codes enthält output.txt:

Hello, World!
This is a new file.

Wichtige Punkte zu write():

  • Es schreibt einen String in die Datei
  • Es fügt nicht automatisch Newline-Zeichen hinzu – Sie müssen \n selbst einfügen
  • Es gibt die Anzahl der geschriebenen Zeichen zurück (auch wenn wir das normalerweise ignorieren)
  • Wenn die Datei bereits existiert, löscht der Schreibmodus den gesamten vorhandenen Inhalt, bevor geschrieben wird

Schauen wir uns an, was passiert, wenn wir in eine bestehende Datei schreiben:

python
# Zuerst eine Datei mit etwas Inhalt erstellen
with open("demo.txt", "w") as file:
    file.write("Original content\n")
 
# Jetzt erneut im Schreibmodus öffnen
with open("demo.txt", "w") as file:
    file.write("New content\n")
 
# Datei lesen, um zu sehen, was sie enthält
with open("demo.txt", "r") as file:
    print(file.read())

Output:

New content

Der ursprüngliche Inhalt ist weg. Der Schreibmodus beginnt immer mit einer leeren Datei, egal ob er eine neue Datei erstellt oder eine bestehende überschreibt.

27.6.2) Mehrere Zeilen schreiben

Sie können write() mehrfach aufrufen, um mehrere Zeilen zu schreiben:

python
with open("shopping_list.txt", "w") as file:
    file.write("Apples\n")
    file.write("Bananas\n")
    file.write("Oranges\n")

27.6.3) Daten aus Collections schreiben

Eine häufige Aufgabe ist das Schreiben von Daten aus Listen oder anderen Collections in eine Datei:

python
students = ["Alice", "Bob", "Carol", "David"]
 
with open("students.txt", "w") as file:
    for student in students:
        file.write(student + "\n")

Das erzeugt students.txt mit folgendem Inhalt:

Alice
Bob
Carol
David

27.6.4) An eine Datei anhängen

Wenn Sie Inhalt ans Ende einer bestehenden Datei hinzufügen möchten, ohne das zu löschen, was bereits vorhanden ist, verwenden Sie den Anhängen-Modus ('a'):

python
# Eine Datei mit Anfangsinhalt erstellen
with open("log.txt", "w") as file:
    file.write("Program started\n")
 
# Später mehr Inhalt anhängen
with open("log.txt", "a") as file:
    file.write("Processing data\n")
    file.write("Processing complete\n")
 
# Datei lesen, um den gesamten Inhalt zu sehen
with open("log.txt", "r") as file:
    print(file.read())

Output:

Program started
Processing data
Processing complete

Der Anhängen-Modus ist perfekt für Logdateien, bei denen Sie ein fortlaufendes Protokoll von Ereignissen behalten möchten. Jedes Mal, wenn Sie die Datei im Anhängen-Modus öffnen, wird neuer Inhalt am Ende hinzugefügt, wobei alles erhalten bleibt, was bereits vorhanden war.

27.7) Häufige Datei-I/O-Fehler behandeln

Dateioperationen können aus vielen Gründen fehlschlagen: Die Datei existiert nicht, Sie haben keine Berechtigung, darauf zuzugreifen, die Festplatte ist voll oder die Datei ist bereits von einem anderen Programm geöffnet. Wenn Sie lernen, diese Fehler sauber zu behandeln, werden Ihre Programme robuster und benutzerfreundlicher.

27.7.1) FileNotFoundError: Wenn eine Datei nicht existiert

Der häufigste Dateifehler tritt auf, wenn Sie versuchen, eine Datei zu lesen, die nicht existiert:

python
# WARNUNG: Das löst FileNotFoundError aus, wenn data.txt nicht existiert
with open("data.txt", "r") as file:
    content = file.read()

Wenn data.txt nicht existiert, löst Python Folgendes aus:

FileNotFoundError: [Errno 2] No such file or directory: 'data.txt'

Um das sauber zu behandeln, verwenden Sie einen try-except-Block (wie wir in Kapitel 25 gelernt haben):

python
try:
    with open("data.txt", "r") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print("Error: The file 'data.txt' was not found.")
    print("Please check the filename and try again.")

Output (wenn die Datei nicht existiert):

Error: The file 'data.txt' was not found.
Please check the filename and try again.

Dieser Ansatz verhindert, dass Ihr Programm abstürzt, und liefert dem Benutzer eine hilfreiche Nachricht.

27.7.2) PermissionError: Wenn Sie nicht auf eine Datei zugreifen können

Manchmal haben Sie keine Berechtigung, eine Datei zu lesen oder zu schreiben:

python
try:
    with open("/root/protected.txt", "r") as file:
        content = file.read()
except PermissionError:
    print("Error: You don't have permission to access this file.")

Berechtigungsfehler können auftreten, wenn:

  • Die Datei einem anderen Benutzer gehört
  • Die Datei in einem geschützten Systemverzeichnis liegt
  • Die Datei als schreibgeschützt markiert ist und Sie versuchen, sie zu beschreiben
  • Unter Windows die Datei in einem anderen Programm geöffnet ist

27.7.3) IsADirectoryError: Wenn Sie versuchen, ein Verzeichnis zu öffnen

Wenn Sie versehentlich versuchen, ein Verzeichnis statt einer Datei zu öffnen:

python
try:
    with open("my_folder", "r") as file:
        content = file.read()
except IsADirectoryError:
    print("Error: 'my_folder' is a directory, not a file.")

Das kann passieren, wenn Sie sowohl eine Datei als auch ein Verzeichnis mit ähnlichen Namen haben oder wenn Sie vergessen, den Dateinamen in einem Pfad anzugeben.

27.7.4) UnicodeDecodeError: Wenn das Encoding nicht passt

Wenn Sie versuchen, eine Datei mit dem falschen Encoding zu lesen, erhalten Sie möglicherweise einen UnicodeDecodeError:

python
try:
    with open("data.txt", "r", encoding="utf-8") as file:
        content = file.read()
except UnicodeDecodeError:
    print("Error: The file encoding doesn't match UTF-8.")
    print("The file might use a different encoding.")

Dieser Fehler tritt auf, wenn die Datei Bytes enthält, die kein gültiges UTF-8 sind. Wenn Sie darauf stoßen, könnte die Datei:

  • Ein anderes Encoding verwenden (wie Latin-1 oder Windows-1252)
  • Eine Binärdatei sein, die Sie als Text zu lesen versuchen
  • Beschädigt sein

27.7.5) Mehrere Fehlertypen behandeln

Sie können mehrere Fehlertypen in einem einzigen try-except-Block abfangen:

python
filename = input("Enter filename: ")
 
try:
    with open(filename, "r") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print(f"Error: '{filename}' does not exist.")
except PermissionError:
    print(f"Error: You don't have permission to read '{filename}'.")
except IsADirectoryError:
    print(f"Error: '{filename}' is a directory, not a file.")
except UnicodeDecodeError:
    print(f"Error: '{filename}' contains invalid text encoding.")

Das liefert für jeden Problemtyp spezifische, hilfreiche Fehlermeldungen. Der Benutzer weiß genau, was schiefgelaufen ist, und kann passende Schritte unternehmen.

27.7.6) Einen allgemeinen Exception-Handler verwenden

Manchmal möchten Sie jeden unerwarteten dateibezogenen Fehler abfangen, der über die spezifischen Typen hinausgeht, die wir behandelt haben. Sie können einen allgemeinen Exception-Handler als Catch-all nach Ihren spezifischen Handlern verwenden:

python
filename = input("Enter filename: ")
 
try:
    with open(filename, "r") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print(f"Error: '{filename}' not found.")
except PermissionError:
    print(f"Error: No permission to read '{filename}'.")
except IsADirectoryError:
    print(f"Error: '{filename}' is a directory.")
except UnicodeDecodeError:
    print(f"Error: '{filename}' has invalid encoding.")
except Exception as e:
    print(f"Unexpected error reading file: {e}")

Damit stellen Sie sicher, dass Ihr Programm auch Fehler behandelt, die Sie nicht erwartet haben. Die Variable e enthält das Exception-Objekt, das eine beschreibende Fehlermeldung enthält. Wenn Sie es ausgeben, erhält der Benutzer technische Details darüber, was schiefgelaufen ist.


Mit Dateien zu arbeiten ist eine grundlegende Fähigkeit in der Programmierung. Sie haben gelernt, wie Sie:

  • Dateipfade und das aktuelle Arbeitsverzeichnis verstehen
  • Dateien korrekt öffnen und schließen
  • Verschiedene Dateimodi zum Lesen, Schreiben und Anhängen verwenden
  • Dateien mit der with-Anweisung automatisch verwalten
  • Dateien mit verschiedenen Methoden lesen (read(), readline(), Iteration, readlines())
  • Inhalte in Dateien schreiben und an Dateien anhängen
  • Häufige Datei-I/O-Fehler sauber behandeln

Diese Fähigkeiten ermöglichen es Ihnen, Programme zu erstellen, die Daten zwischen Ausführungen dauerhaft speichern, Textdateien verarbeiten, Berichte erzeugen und vieles mehr. Im nächsten Kapitel werden wir Context Manager im Detail untersuchen, den Mechanismus verstehen, der die with-Anweisung funktionieren lässt, und lernen, wie Sie eigene Context Manager erstellen, um Ressourcen über Dateien hinaus zu verwalten.

© 2025. Primesoft Co., Ltd.
support@primesoft.ai