Dateien lesen und schreiben · Übung
Einen aktuellen Bericht schreiben
Eine Ausgabe zeigt, was ein Programmlauf wusste. Eine Berichtsdatei lässt das Ergebnis den Prozess überdauern.
Diese Lektion ergänzt zwei getrennte Vorgänge:
build_report(books)wandelt Python-Werte in einen einzelnen String um.write_report(path, text)speichert genau diesen String.
Beide getrennt zu halten macht sie leichter nachvollziehbar. Die Berichtsformatierung braucht kein Dateisystem, und das Schreiben einer Datei braucht kein Wissen über Bücher.
Zuerst den gesamten Text aufbauen
Gib für jede übergebene Liste diese Form mit einem abschließenden Zeilenumbruch zurück:
Reading report
==============
Books: 2
- Unseen title one
- Unseen title two
Beginne eine Liste lines mit Überschrift und Anzahl. Hänge für jedes Buch einen Aufzählungspunkt an und gib dann "\n".join(lines) + "\n" zurück.
Der abschließende Zeilenumbruch ist klein, aber beabsichtigt. Textdateien, die von Kommandozeilenwerkzeugen erzeugt werden, enden üblicherweise damit. So landen die nächste Eingabeaufforderung und später angehängter Text nicht auf der letzten Inhaltszeile.
"w" bedeutet: Diese Datei ist eine Momentaufnahme
Öffne den übergebenen Berichtspfad so:
with open(path, "w", encoding="utf-8") as handle:
handle.write(text)
Der Modus "w" erstellt die Datei, wenn sie fehlt. Wenn sie bereits existiert, leert das Öffnen in diesem Modus die Datei, bevor der neue Text geschrieben wird.
Du kannst das beobachten:
Zuerst wurden drei Zeilen hineingeschrieben, dann eine. Übrig bleibt eine Zeile. Das zweite open hat nichts angehängt und nicht nur die ersten Zeichen überschrieben. Es hat die Datei geleert.
Dieses eigenständige Beispiel schreibt eine Testdatei demo.txt dort, wo der eingebettete Code läuft. Es erstellt nicht den Bericht des Kapitelprojekts. Halte in deinem Projekt den beabsichtigten Ausgabepfad ausdrücklich fest, damit du einen aktuellen Bericht von einem alten Experiment unterscheiden kannst.
Das klingt destruktiv, weil es das ist. Entscheidend ist, ob das Ersetzen zur Bedeutung der Datei passt. reading_report.txt verspricht den aktuellen Stand von data/books.txt, kein historisches Archiv. Zusätzliche Zeilen von gestern unter dem kürzeren Bericht von heute stehen zu lassen wäre falsch. Deshalb ist Ersetzen hier die sichere Wahl.
Verwende "w" erst, nachdem du entschieden hast, dass die gesamte Datei ersetzbar ist. Python fragt nicht nach einer Bestätigung.
Mit main verbinden
Nach den vorhandenen Fehlerbehandlungen:
baue den Bericht aus
booksauf;schreibe ihn nach
REPORT_PATH;gib
Wrote reading_report.txt for N books.mit dem tatsächlichen Pfad und der tatsächlichen Anzahl aus.
Hänge noch keinen Verlauf an. Die nächste Lektion gibt dieser anderen Datei einen anderen Modus.
Warum passt der Modus "w" zu reading_report.txt?
Prüfe das Ersetzen selbst, bevor du einreichst. Führe das Programm einmal aus, öffne reading_report.txt und füge am Ende von Hand einige unsinnige Zeilen hinzu. Führe es erneut aus. Diese Zeilen sollten verschwunden sein, weil "w" die Datei zuerst geleert hat. Sind sie noch da, hängt deine Schreibfunktion an.
Aufgabe
Implementiere den Ablauf für den aktuellen Bericht.
build_report(books)muss die beschriebene Überschrift, die tatsächliche Anzahl, einen Aufzählungspunkt pro übergebenem Titel und einen abschließenden Zeilenumbruch zurückgeben.write_report(path, text)muss einewith-Anweisung, den ausdrücklich angegebenen Modus"w"und UTF-8 verwenden und den übergebenen Text schreiben.Bei erfolgreicher Eingabe muss
main()den Bericht aufbauen und nachREPORT_PATHschreiben und dannWrote reading_report.txt for N books.ausgeben.Behalte die beiden vorhandenen eng begrenzten Behandlungen von Dateifehlern bei.
Hänge noch keinen Verlauf an.