0%

Bestanden lezen en schrijven · oefening

Een nieuw rapport schrijven

Afdrukken laat zien wat één uitvoering wist. Met een rapportbestand blijft het resultaat bestaan nadat het proces is gestopt.

Deze les voegt twee aparte bewerkingen toe:

  1. build_report(books) zet Python-waarden om in één string.

  2. write_report(path, text) slaat precies die string op.

Door ze te scheiden kun je beide gemakkelijker doorgronden. Het opmaken van een rapport heeft geen bestandssysteem nodig, en het schrijven van een bestand hoeft niets van boeken te weten.

Bouw eerst de volledige tekst op

Geef voor elke meegegeven lijst dit formaat terug, met één afsluitende newline:

Reading report
==============
Books: 2
- Unseen title one
- Unseen title two

Begin een lijst lines met de kop en het aantal. Voeg per boek één opsommingspunt toe en geef dan "\n".join(lines) + "\n" terug.

De afsluitende newline is klein maar bewust gekozen. Tekstbestanden die opdrachtregelhulpmiddelen maken, eindigen volgens de gebruikelijke afspraak daarmee. Zo komt de volgende shellprompt of later toegevoegde tekst niet op de laatste inhoudsregel terecht.

"w" betekent dat dit bestand een momentopname is

Open het meegegeven rapportpad zo:

with open(path, "w", encoding="utf-8") as handle:
    handle.write(text)

Modus "w" maakt het bestand aan als het ontbreekt. Bestaat het al, dan maakt openen in deze modus het leeg voordat de nieuwe tekst wordt geschreven.

Je kunt zien hoe dat gebeurt:

Try it

Er gingen drie regels in, daarna één, en er blijft één regel over. De tweede open voegde niets toe aan het bestand en overschreef niet alleen de eerste paar tekens. Het bestand werd leeggemaakt.

Dat zelfstandige voorbeeld schrijft een tijdelijk demo.txt waar de code in de les wordt uitgevoerd. Het maakt niet het rapport van het hoofdstukproject. Houd in je project het bedoelde uitvoerpad expliciet, zodat je een huidig rapport kunt onderscheiden van een oud experiment.

Dat klinkt vernietigend omdat het dat is. De vraag is of vervangen past bij wat het bestand betekent. reading_report.txt belooft de huidige weergave van data/books.txt, geen historisch archief. Extra regels van gisteren onder het kortere rapport van vandaag laten staan zou onjuist zijn, dus vervangen is hier de veilige keuze.

Gebruik "w" pas nadat je hebt besloten dat het hele bestand vervangbaar is. Python vraagt niet om bevestiging.

Verbind dit met main

Na de bestaande foutafhandelingen:

  • bouw je het rapport op uit books;

  • schrijf je het naar REPORT_PATH;

  • druk je Wrote reading_report.txt for N books. af met het werkelijke pad en aantal.

Voeg nog geen geschiedenis toe. De volgende les geeft dat andere bestand een andere modus.

Waarom past modus "w" bij reading_report.txt?

Controleer zelf het vervangen voordat je inlevert. Voer het programma één keer uit, open reading_report.txt en voeg onderaan met de hand wat onzinregels toe. Voer het opnieuw uit. De onzin moet weg zijn, omdat "w" het bestand eerst heeft leeggemaakt. Staat die er nog, dan voegt je schrijffunctie tekst toe in plaats van te vervangen.

Opdracht

Implementeer het schrijven van een nieuw rapport.

  • build_report(books) moet de getoonde kop, het werkelijke aantal, één opsommingspunt per meegegeven titel en één afsluitende newline teruggeven.

  • write_report(path, text) moet een with-instructie, expliciete modus "w" en UTF-8 gebruiken en de meegegeven tekst schrijven.

  • Bij geslaagde invoer moet main() het rapport opbouwen en naar REPORT_PATH schrijven, en daarna Wrote reading_report.txt for N books. afdrukken.

  • Behoud de twee bestaande gerichte afhandelingen van bestandsfouten.

Voeg nog geen geschiedenis toe.