HOWTO · Python
Leiten Sie die Druckausgabe in eine Datei in Python um
Dieses Tutorial zeigt, wie Sie die Druckausgabe in eine Datei in Python umleiten
Auf dieser Seite
Um Text in Python in einer Datei zu speichern, öffnen Sie sie mit open() und schreiben über das zurückgegebene Dateiobjekt. Verwenden Sie den Modus "w", um eine Datei anzulegen oder zu ersetzen, oder "a", um am Ende Inhalt anzufügen. Eine with-Anweisung schließt die Datei, sobald der Block endet.
Dieses Beispiel schreibt eine Nachricht in report.txt und gibt anschließend den gespeicherten Text aus:
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as folder:
path = Path(folder) / "report.txt"
with path.open("w", encoding="utf-8") as file:
file.write("Monthly report\nRevenue: 1200\n")
print(f"Saved to {path.name}:")
print(path.read_text(encoding="utf-8"), end="")
Saved to report.txt:
Monthly report
Revenue: 1200
Die folgenden Beispiele zeigen, wann Sie write(), print(), die Umleitung der Standardausgabe, writelines() oder die Pfadschnittstelle von pathlib verwenden. Die meisten Beispiele schließen die Datei mit einer with-Anweisung automatisch; das sys.stdout-Beispiel stellt den vorherigen Stream wieder her und schließt die Datei ausdrücklich.
Text mit open() und write() schreiben
open() legt fest, wie eine Datei geöffnet wird; write() ist eine Methode des zurückgegebenen Dateiobjekts. Der Modus "w" legt eine Datei an oder ersetzt ihren bisherigen Inhalt. Der Modus "a" legt die Datei bei Bedarf an und fügt Text am Ende hinzu. Dabei handelt es sich um Modi zum Öffnen einer Datei, nicht um Operationen von write().
write() nimmt eine Zeichenkette entgegen und fügt keinen Zeilenumbruch hinzu. Setzen Sie \n an die Stellen, an denen eine neue Zeile beginnen soll. Der Rückgabewert gibt die Anzahl der geschriebenen Zeichen an.
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as folder:
path = Path(folder) / "notes.txt"
with path.open("w", encoding="utf-8") as file:
file.write("First line\n")
file.write("Second line\n")
print(path.read_text(encoding="utf-8"), end="")
First line
Second line
Zum Anhängen ändern Sie den Modus in "a". Beispielsweise fügt with open("notes.txt", "a", encoding="utf-8") as file: file.write("Next entry\n") nach dem vorhandenen Inhalt eine Zeile hinzu. Der Pfad wird relativ zum aktuellen Arbeitsverzeichnis des Programms aufgelöst, sofern Sie keinen anderen Pfad angeben.
Mit print() in eine Datei schreiben
Verwenden Sie print(..., file=file_object), wenn Sie die vertraute Formatierung von print() nutzen, die Ausgabe aber in einer Datei speichern möchten. Die Funktion wandelt Objekte in Text um, trennt mehrere Werte standardmäßig durch ein Leerzeichen und fügt standardmäßig einen Zeilenumbruch hinzu. Mit sep und end können Sie diese Einstellungen ändern.
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as folder:
path = Path(folder) / "summary.txt"
with path.open("w", encoding="utf-8") as file:
print("Count:", 3, file=file)
print("Ready:", True, file=file)
print(path.read_text(encoding="utf-8"), end="")
Count: 3
Ready: True
Der with-Block schließt die Datei, sobald die Ausgabe abgeschlossen ist. close() innerhalb dieses Blocks aufzurufen, ist unnötig: Wenn der Block endet, schließt Python die Datei automatisch.
Standardausgabe mit sys.stdout umleiten
sys.stdout ist der Stream, den print() verwendet, wenn kein Argument file angegeben ist. Wenn Sie eine Datei sys.stdout zuweisen, wird die Standardausgabe für den Prozess umgeleitet. Speichern Sie deshalb den vorherigen Stream, stellen Sie ihn wieder her und schließen Sie die Datei. Für eine übliche, zeitlich begrenzte Umleitung empfiehlt sich contextlib.redirect_stdout() aus dem nächsten Abschnitt. Der verlinkte sys.stdout-Referenzartikel ist derzeit nur auf Englisch verfügbar: Referenz zu sys.stdout.
import sys
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as folder:
path = Path(folder) / "log.txt"
previous_stdout = sys.stdout
file = path.open("w", encoding="utf-8")
try:
sys.stdout = file
print("Job complete")
finally:
sys.stdout = previous_stdout
file.close()
print(path.read_text(encoding="utf-8"), end="")
Job complete
Wenn Sie den ursprünglichen Stream in finally wiederherstellen, geht die spätere Ausgabe wieder an ihr vorheriges Ziel – auch dann, wenn im umgeleiteten Block ein Fehler auftritt. Die äußere with-Anweisung verwaltet das temporäre Verzeichnis; die Datei selbst wird nach dem Wiederherstellen von sys.stdout ausdrücklich geschlossen.
Ausgabe mit contextlib.redirect_stdout() vorübergehend umleiten
contextlib.redirect_stdout() leitet sys.stdout innerhalb eines with-Blocks vorübergehend auf ein dateiähnliches Objekt um. Sobald der Block endet, wird der vorherige Standardausgabestream wiederhergestellt. Die Datei wird weiterhin durch ihre eigene with-Anweisung verwaltet.
import contextlib
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as folder:
path = Path(folder) / "output.txt"
with path.open("w", encoding="utf-8") as file:
with contextlib.redirect_stdout(file):
print("Build finished")
print(path.read_text(encoding="utf-8"), end="")
Build finished
Mit diesem Ansatz erfassen Sie print()-Aufrufe und andere Schreibvorgänge in die Standardausgabe, die innerhalb des Kontexts stattfinden. Die Standardfehlerausgabe (sys.stderr) wird dadurch nicht umgeleitet.
Eine Sequenz mit writelines() schreiben
writelines() schreibt jede Zeichenkette aus einem iterierbaren Objekt der Reihe nach in die Datei. Die Methode fügt keine Zeilenumbrüche ein. Wenn die Datei getrennte Zeilen enthalten soll, fügen Sie daher \n in die Zeichenketten ein.
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as folder:
path = Path(folder) / "items.txt"
lines = ["apples\n", "pears\n", "plums\n"]
with path.open("w", encoding="utf-8") as file:
file.writelines(lines)
print(path.read_text(encoding="utf-8"), end="")
apples
pears
plums
Bei einer Textdatei müssen die Elemente Zeichenketten sein. Wenn keine Zeilenumbrüche gewünscht sind, lassen Sie \n in den einzelnen Zeichenketten weg.
Dateien mit pathlib öffnen und beschreiben
pathlib stellt Objekte bereit, mit denen sich Dateisystempfade zusammensetzen und verwenden lassen. Es ersetzt keine Dateiobjekte: Rufen Sie Path.open() auf, um ein Dateiobjekt zu erhalten, und verwenden Sie anschließend dessen Methode write(). Das ist hilfreich, wenn sich der Pfad aus Ordnern oder anderen Pfadbestandteilen zusammensetzt.
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as folder:
path = Path(folder) / "archive" / "entry.txt"
path.parent.mkdir()
with path.open("w", encoding="utf-8") as file:
file.write("Stored with pathlib.\n")
print(path.read_text(encoding="utf-8"), end="")
Stored with pathlib.
Verwenden Sie Path.write_text() für einen kompakten Schreibvorgang in einem Schritt, wenn Sie kein Dateiobjekt direkt verwalten müssen. Für wiederholte Schreibvorgänge oder Methoden wie writelines() liefert Path.open() das Dateiobjekt, mit dem Sie arbeiten können.
Für die umgekehrte Aufgabe lesen Sie wie Sie in Python eine Datei in eine Zeichenkette einlesen.