Dateien lesen
Python liest und schreibt Dateien über Dateiobjekte. Im Textmodus dekodiert das Objekt die gespeicherten Bytes mit einer gewählten Zeichenkodierung zu Strings. Im Binärmodus stellt es die Bytes unverändert bereit.
Lege im Übungsordner vier UTF-8-Textdateien an: file.txt, data.txt, sample.txt und input.txt, jeweils mit Halo Python ohne abschließenden Zeilenumbruch. Führe die Lesebeispiele vor den Schreibbeispielen aus, denn w ersetzt den Dateiinhalt. Im Positionsbeispiel liefert der erste Lesevorgang Halo , der zweite Pyt und der wiederholte ebenfalls Pyt.
Gesamten Dateiinhalt lesen
Die Methode read() lädt den gesamten verbleibenden Dateiinhalt auf einmal in den Speicher:
# Die gesamte UTF-8-Textdatei auf einmal lesen
with open('file.txt', 'r', encoding='utf-8') as f:
txt = f.read()
print(txt)
# Ausgabe:
# Halo Pythonopen() erzeugt das Dateiobjekt, read() liest seinen Text und der with-Block schließt die Datei automatisch. Das gilt auch dann, wenn eine Exception den Vorgang unterbricht.
Datei Zeile für Zeile lesen
Bei großen Dateien ist das zeilenweise Lesen effizienter, da nicht die gesamte Datei auf einmal in den Speicher geladen wird.
# Eine UTF-8-Textdatei Zeile für Zeile lesen
with open('file.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line, end='')
# Hinweis: Jede Zeile behält ihr Zeilenumbruchzeichen
# Der Parameter end='' verhindert das Hinzufügen zusätzlicher ZeilenumbrücheJede Zeile behält ihren abschließenden Zeilenumbruch, sofern einer vorhanden ist. Die letzte Zeile kann ohne Zeilenumbruch enden. Mit end='' fügt print() keinen zweiten hinzu.
Schreiben in Dateien
Beim Schreiben in eine Datei bleiben Daten oder Berechnungsergebnisse erhalten, nachdem das Programm beendet wurde. Python öffnet die Datei in einem Modus, der festlegt, ob vorhandener Inhalt ersetzt oder ergänzt wird, und schreibt anschließend über das zurückgegebene Dateiobjekt.
Strings in Dateien schreiben
Dieses Beispiel verwendet w, um den gesamten Dateiinhalt zu ersetzen. Zehn Aufrufe von write() laufen innerhalb eines einzigen with-Blocks, bevor die Datei geschlossen wird.
# Strings in eine UTF-8-Textdatei schreiben
with open('file.txt', 'w', encoding='utf-8') as f:
for i in range(1, 11):
f.write(f'Zeile {i}\n')
# Die Datei enthält:
# Zeile 1
# Zeile 2
# Zeile 3
# ... (bis Zeile 10)Druckausgabe in eine Datei umleiten
Mit dem Parameter file kannst du die Ausgabe von print() direkt in eine Datei umleiten.
# print-Ausgabe in eine UTF-8-Textdatei umleiten
with open('file.txt', 'w', encoding='utf-8') as f:
for i in range(1, 21):
print("Zeile", i, file=f)
# Die Datei enthält eine umgeleitete Druckausgabe
# Zeile 1
# Zeile 2
# ... (bis Zeile 20)Das Argument file verwendet die Formatierung von print() weiter, leitet den fertigen Text aber an das gewählte Dateiobjekt.
Dateiöffnungsmodi
Python bietet verschiedene Modi zum Öffnen von Dateien entsprechend den Anforderungen der auszuführenden Vorgänge.
Dateiöffnungssyntax
# Eine vorhandene Textdatei lesen
with open('data.txt', 'r', encoding='utf-8') as f:
first_line = f.readline()
# Eine Datei erstellen oder ihren bisherigen Inhalt leeren
with open('output.txt', 'w', encoding='utf-8') as f:
f.write('neuer Inhalt')
# Eine Datei erstellen oder an ihren Inhalt anhängen
with open('log.txt', 'a', encoding='utf-8') as f:
f.write('nächstes Ereignis\n')
# Eine vorhandene Datei lesen und schreiben, ohne sie beim Öffnen zu leeren
with open('data.txt', 'r+', encoding='utf-8') as f:
original = f.read()Der Modus bestimmt, ob die Datei bereits existieren muss, ob ihr alter Inhalt beim Öffnen gelöscht wird und welche Operationen erlaubt sind. r und r+ benötigen eine vorhandene Datei. w erstellt oder leert sie, während a sie erstellt oder Daten anhängt. Das Suffix b wählt den Binärmodus, in dem keine encoding-Angabe verwendet wird.
Methoden zum Lesen von Dateien
Python bietet mehr als einen Weg, eine Datei zu lesen. Die Wahl hängt davon ab, wie viel Inhalt du auf einmal brauchst und ob die Leseposition danach noch eine Rolle spielt. read() liest den gesamten Rest oder höchstens die angeforderte Zeichenzahl. readline() liest eine Zeile, während readlines() ohne Argument alle verbleibenden Zeilen in eine Liste lädt.
Methode Read mit Parametern
read() nimmt ein Größenargument entgegen, deshalb kannst du jeweils eine feste Anzahl Zeichen lesen. Das Beispiel vergleicht höchstens zehn Zeichen, den gesamten Inhalt und eine Zeile.
# Mehrere Methoden zum Lesen von Text ausprobieren
with open('file.txt', 'r', encoding='utf-8') as f:
# Höchstens 10 Zeichen lesen
s = f.read(10)
print("10 Zeichen:", s)
# Zum Anfang zurückkehren und die gesamte Datei lesen
f.seek(0)
s = f.read()
print("Gesamte Datei:", s)
# Erneut zurückkehren und eine Zeile samt Zeilenumbruch lesen
f.seek(0)
s = f.readline()
print("Eine Zeile:", repr(s))Dateiposition und Lesen
Eine im Modus r geöffnete Datei beginnt an ihrer ersten Streamposition. Durch das Lesen bewegt sich diese Position weiter. Im Textmodus kann tell() eine besondere Positionsmarke zurückgeben. Speichere diese Marke und übergib sie wieder an Python, wenn du dieselbe Position benötigst.
# Dateiposition demonstrieren
with open('sample.txt', 'r', encoding='utf-8') as f:
first_read = f.read(5) # Höchstens 5 Zeichen lesen
saved_position = f.tell()
print("Erste Ausgabe:", first_read)
second_read = f.read(3) # Von der aktuellen Position weiterlesen
print("Zweite Ausgabe:", second_read)
f.seek(saved_position) # Zur gespeicherten Textstream-Position zurückkehren
repeated = f.read(3)
print("Wiederholte Ausgabe:", repeated)Im Textmodus geben read() und readline() Strings zurück. Ist kein Text mehr vorhanden, liefern sie ''. Im Binärmodus geben sie bytes zurück und verwenden am Dateiende b''. Eine Iteration endet dort automatisch.
Sicherer Umgang mit Dateien
Die with-Anweisung schließt eine Datei automatisch am Ende ihres Blocks, auch wenn eine Operation im Block eine Ausnahme auslöst.
# Verwendung der with-Anweisung zur sicheren Dateiverarbeitung
with open('file.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
# Datei wird nach Verlassen des with-Blocks automatisch geschlossen
# Mit einer with-Anweisung schreiben
with open('output.txt', 'w', encoding='utf-8') as f:
f.write("Hello World!")
f.write("\nZweite Zeile")
# Datei automatisch geschlossen und gespeichert
# Gleichzeitiges Lesen und Schreiben
with open('input.txt', 'r', encoding='utf-8') as input_file, open('output.txt', 'w', encoding='utf-8') as output_file:
data = input_file.read()
output_file.write(data.upper())
# Beide Dateien wurden automatisch geschlossenDie with-Anweisung stellt sicher, dass Dateien immer ordnungsgemäß geschlossen werden, auch wenn im Programm ein Fehler auftritt. Dadurch wird verhindert, dass Dateien geöffnet bleiben und Systemressourcen verbrauchen.