Bestanden lezen en schrijven · oefening
Toevoegen zonder te wissen
reading_report.txt beantwoordt de vraag “wat geldt nu?” Het geschiedenisbestand beantwoordt een andere vraag: “welke geslaagde uitvoeringen hebben plaatsgevonden?”
Verschillende betekenissen verdienen verschillende modi.
Toevoegen begint aan het einde
Implementeer deze kleine overgang naar het bestand:
def append_history(path, count):
with open(path, "a", encoding="utf-8") as handle:
handle.write(f"Recorded {count} books.\n")
Modus "a" maakt het bestand aan als het ontbreekt. Bestaat het al, dan komt elke schrijfactie aan het einde terecht in plaats van eerdere inhoud te vervangen.
Zet een tijdelijk bestand terug naar een beginstand en verander dan één letter voor de tweede schrijfactie:
De eerste keer openen laat het experiment vanuit een bekende toestand beginnen. De tweede keer blijft die bestaande regel behouden en komt er een bij. "w" en "a" verschillen één teken, met alle gevolgen die dat teken heeft. Verwijder append-demo.txt als je klaar bent; het is een proefbestand, geen onderdeel van het project.
De functie schrijft in één aanroep één volledig record, inclusief de newline. Zo blijven de grenzen tussen records zichtbaar. Een toekomstige versie kan een datum of bronnaam vastleggen, maar een klok zou het huidige project en de beoordelaar niet-deterministisch maken. Dit hoofdstuk legt alleen het vaste feit vast dat het daadwerkelijk kent: het aantal boeken dat deze uitvoering heeft verwerkt.
Vervangen en behouden zijn keuzes
De belangrijke les is niet “toevoegen is veiliger dan schrijven”. Dat is niet zo.
Gebruik
"w"wanneer het hele bestand één vervangbaar resultaat is.Gebruik
"a"wanneer bestaande volledige records horen bij wat het bestand betekent.
Elk nieuw rapport toevoegen zou meerdere koppen en meerdere actuele aantallen achterlaten in een bestand dat één huidig rapport belooft. De geschiedenis vervangen zou stilletjes het bewijs vernietigen dat het bestand juist moet bewaren.
Maak voordat je een modus kiest deze zin af: “Dit bestand stelt … voor.” De juiste modus volgt daar vaak direct uit.
Maak het succespad af
Voeg nadat main() het nieuwe rapport heeft geschreven één geschiedenisrecord toe en verander de succesmelding naar:
Wrote reading_report.txt and recorded 4 books.
Het werkelijke pad en aantal moeten die waarden leveren. Houd de twee foutafhandelingen vóór alle schrijfacties; een mislukte leesactie mag geen rapport of geschiedenisrecord maken dat eruitziet als succes.
Welke combinatie past bij de betekenis van de bestanden?
Controleer dit zoals je het rapport controleerde: voer het programma twee keer uit en open reading_history.txt. Je hoort twee records te zien, geen één. Voer het daarna een derde keer uit en controleer of je er drie ziet, in de volgorde waarin ze ontstonden. Een geschiedenis die alleen de laatste uitvoering bewaart, is vergeten waarvoor ze dient.
Opdracht
Maak het succespad van het logboek af.
Implementeer
append_history(path, count)met eenwith-instructie, expliciete modus"a"en UTF-8.Voeg precies
Recorded N books.\ntoe met het meegegeven aantal.Na het schrijven van het nieuwe rapport moet
main()één geschiedenisrecord toevoegen.Druk
Wrote reading_report.txt and recorded N books.af met het werkelijke rapportpad en aantal.Behoud de bestaande gerichte foutafhandeling; een mislukte leesactie mag niet als succes worden vastgelegd.