Project J - Genereer rapporten
01 - Projectoverzicht
- In dit project maak je een Python-script dat automatisch een rapport genereert uit meetgegevens of administratieve data.
- Het script lost het probleem op dat je dezelfde samenvatting elke week of maand opnieuw moet schrijven.
- Je gebruikt een CSV-bestand of tekstbestand met gegevens zoals datum, categorie, status en aantallen.
- Het script berekent kerncijfers en schrijft daar een leesbaar rapport van met kopjes en korte conclusies.
- Het resultaat is een Markdown- of tekstbestand dat je direct kunt bewaren, mailen of verder bewerken.
- Je gebruikt AI om code te laten maken die data analyseert en daarna een vaste rapporttemplate vult.
- Je voert de code uit in VS Code en opent het gegenereerde rapport om inhoud en opbouw te controleren.
- Als het rapport te algemeen is, verbeter je de prompt met exacte kopjes, gewenste zinnen en voorbeeldconclusies.
02 - Projectmap en Python-omgeving
Voorkennis: doorloop de voorgaande projecten. Het doel en gebruik van .venv zijn uitgelegd in project A, blok 02. Voor ieder nieuw project maak je een eigen omgeving; hieronder herhaal je die bekende stappen.
- Maak een eigen projectmap
project_jen open die map in VS Code. Maak daarin straksrapport.py. - Deze oefeningen voer je lokaal uit in de terminal van VS Code, omdat ze bestanden op je computer lezen of schrijven. Gebruik hiervoor de Python-installatie uit de basiscursus.
- Controleer je Python-versie. Werkt
pythonop macOS of Linux niet, gebruik danpython3voor het aanmaken van de omgeving.
python --version
python -m venv .venv
Activeer de omgeving. In Windows PowerShell:
.venv\Scripts\Activate.ps1
In de Windows-opdrachtprompt (cmd):
.venv\Scripts\activate.bat
Op macOS of Linux:
source .venv/bin/activate
Kies in VS Code via Python: Select Interpreter de interpreter uit .venv. Gebruik vanaf nu de geactiveerde terminal. Je verlaat de omgeving later met deactivate.
Dit project gebruikt alleen de standaardbibliotheek van Python. Extra pakketten installeren is niet nodig.
03 - Testgegevens voorbereiden
Maak meldingen.csv naast het script met onderstaande oefengegevens. Elke regel is één melding; de twee toegestane statussen zijn open en afgerond. Het rapport beschrijft alle regels in het bestand.
datum,categorie,status
2026-05-01,Website,open
2026-05-02,Website,afgerond
2026-05-03,Administratie,afgerond
2026-05-04,Website,open
04 - Begrippen en hulpmiddelen vóór de opdracht
- CSV-validatie ken je uit F en G, Markdown uit I. Counter uit
collectionsis een dictionary die aantallen per sleutel bijhoudt; een ontbrekende sleutel telt als nul. min(datums)enmax(datums)kiezen begin en einde van de periode. We controleren eerst of er gegevens zijn, zodat dit ook bij een leeg bestand werkt.- Een template is een vaste tekstindeling met invulplaatsen. Hier maken we die met een lijst strings; er is geen extra templatepakket nodig.
Countertelt hoe vaak een status of categorie voorkomt. Een ontbrekende status levert nul op.- De periode is de vroegste tot en met de laatste datum in het bronbestand. Dit is geen automatisch weekfilter.
- De conclusie komt uit een vaste template. Er wordt tijdens het uitvoeren geen AI aangeroepen en er worden geen oorzaken verzonnen. Een bestaande
rapport.mdwordt alleen na een geslaagde analyse vervangen.
05 - Een gerichte AI-prompt maken
Geef AI eerst een concrete opdracht. Kopieer bijvoorbeeld deze prompt en vergelijk het antwoord met de voorbeeldcode in het volgende blok:
Maak met csv, Counter en datetime een script dat meldingen.csv controleert
en rapport.md schrijft. Vereis datum,categorie,status, valideer datums en
accepteer alleen open of afgerond. Stop met regelnummer bij fouten. Toon
periode, totaal, aantallen per status en per categorie, en percentage
afgerond op één decimaal. Gebruik vaste kopjes Samenvatting, Per categorie
en Conclusie. Maak alleen conclusies die uit de aantallen volgen. Behandel
een bestand met alleen een kopregel zonder deling door nul.
Vraag om uitleg bij onbekende regels en controleer welke bestanden de code leest en schrijft voordat je haar uitvoert. Gebruik de oefengegevens uit dit project.
06 - Een werkende basisversie
Dit is een complete basisversie voor rapport.py. Neem de code over of vergelijk haar met het antwoord van AI.
from pathlib import Path
from collections import Counter
from datetime import date
import csv
BASIS = Path(__file__).resolve().parent
def main():
statussen = Counter()
categorieen = Counter()
datums = []
with (BASIS / "meldingen.csv").open(newline="", encoding="utf-8-sig") as bestand:
lezer = csv.DictReader(bestand)
if not {"datum", "categorie", "status"}.issubset(lezer.fieldnames or []):
raise ValueError("Verwachte kolommen: datum,categorie,status")
for nummer, rij in enumerate(lezer, start=2):
try:
datum = date.fromisoformat(rij["datum"])
categorie = rij["categorie"].strip()
status = rij["status"].strip().lower()
if not categorie or status not in {"open", "afgerond"}:
raise ValueError("Categorie leeg of onbekende status")
except (ValueError, TypeError, AttributeError) as fout:
raise ValueError(f"Controleer regel {nummer}: {fout}") from fout
datums.append(datum)
statussen[status] += 1
categorieen[categorie] += 1
totaal = sum(statussen.values())
regels = ["# Meldingenrapport", "", "## Samenvatting", ""]
if totaal:
percentage = statussen["afgerond"] / totaal * 100
regels.extend([f"Periode: {min(datums)} t/m {max(datums)}", f"Totaal: {totaal}",
f"Open: {statussen['open']}", f"Afgerond: {statussen['afgerond']}",
f"Percentage afgerond: {percentage:.1f}%"])
else:
regels.append("Geen gegevens; periode en percentage zijn niet beschikbaar.")
regels.extend(["", "## Per categorie", ""])
for naam, aantal in sorted(categorieen.items()):
regels.append(f"- {naam}: {aantal}")
regels.extend(["", "## Conclusie", ""])
regels.append(f"Er staan {statussen['open']} open meldingen in dit bestand."
if totaal else "Er zijn geen meldingen om te beoordelen.")
doel = BASIS / "rapport.md"
doel.write_text("\n".join(regels) + "\n", encoding="utf-8")
print(f"Rapport gemaakt: {doel}")
if __name__ == "__main__":
try:
main()
except (OSError, ValueError, csv.Error) as fout:
print(f"Rapport niet vernieuwd: {fout}")
07 - Het script uitvoeren
- Sla de volledige code op als
rapport.pyin je projectmap. Zet eventuele invoerbestanden op de plek die in blok 03 staat. - Open de geïntegreerde terminal in die projectmap en activeer
.venvals dat nog niet is gebeurd. - Voer het script uit met:
python rapport.py
Lees eerst de terminaluitvoer en open daarna eventuele uitvoerbestanden. Controleer het resultaat met blok 08 voordat je met eigen gegevens verdergaat.
08 - Het resultaat controleren
- Het rapport toont vier meldingen: twee open, twee afgerond en 50.0% afgerond.
- Website heeft drie meldingen, Administratie één. De periode is 2026-05-01 t/m 2026-05-04.
- Test alleen een kopregel en daarna een onbekende status
bezig. De eerste geeft een leeg rapport, de tweede een foutmelding zonder nieuw rapport.
09 - Fouten herkennen en oplossen
- Een percentage klopt niet? Controleer of je deelt door het totale aantal regels en niet alleen door open meldingen.
- Een oud rapport blijft zichtbaar na een fout? Dat is de vorige succesvolle uitvoer. Lees de terminalmelding en herstel de brongegevens.
10 - Uitbreiden en afronden
Probeer deze vervolgstap pas als de basis werkt:
Laat AI een begin- en einddatum als variabelen toevoegen om een weekrapport te maken. Vraag expliciet dat de conclusie alleen over die selectie gaat en test meldingen op beide grensdatums.
Bewaar je werkende basisversie en verander één onderdeel tegelijk. Geef AI bij een fout de foutmelding, het relevante stukje code, je testinvoer en de verwachte uitkomst.
Het project is afgerond wanneer de basiscontrole uit blok 08 slaagt en je in eigen woorden kunt uitleggen welke invoer wordt gebruikt, hoe de verwerking werkt en waar de uitvoer terechtkomt.