Project B - Hernoem bestanden automatisch

01 - Projectoverzicht
  • In dit project maak je een Python-script dat meerdere bestanden automatisch een nette naam geeft.
  • Het script lost het probleem op van bestanden met namen zoals IMG_1234.jpg, scan final nieuw.pdf of document (1).docx.
  • Je gebruikt een testmap met kopieën van bestanden, zodat je veilig kunt oefenen zonder originele bestanden kwijt te raken.
  • Het script maakt nieuwe bestandsnamen met vaste onderdelen zoals datum, volgnummer, categorie en oorspronkelijke extensie.
  • Het resultaat is een map waarin alle bestanden consequent en herkenbaar zijn hernoemd.
  • Je gebruikt AI om Python-code te laten maken die eerst een voorbeeld toont voordat bestanden echt worden aangepast.
  • Je voert de code uit in VS Code en controleert de uitvoer in de terminal.
  • Als de namen niet goed genoeg zijn, verbeter je de prompt met extra regels voor spaties, hoofdletters, accenten en volgnummers.
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_b en open die map in VS Code. Maak daarin straks hernoemen.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 python op macOS of Linux niet, gebruik dan python3 voor 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 een map invoer met drie kopieën van oefenbestanden, bijvoorbeeld scan nieuw.txt, notitie.txt en foto.jpg. Kies voor de foto een echte afbeelding. Het doel is een naam als 2026-05-01_document_001.jpg, in alfabetische volgorde van de oorspronkelijke namen.

De datum is in deze oefening een vaste projectdatum. Bewaar de originele bestanden buiten de oefenmap.

04 - Begrippen en hulpmiddelen vóór de opdracht
  • Je bouwt voort op de paden en CSV-uitvoer uit project A. enumerate(bestanden, start=1) geeft tijdens de lus zowel het volgnummer als het bestand.
  • In een f-string bepaalt :03d de weergave van een geheel getal: drie posities met voorloopnullen. 1 wordt 001.
  • TESTMODUS is een boolean: True toont alleen het plan, False voert het uit. rename wijzigt een bestandsnaam. exists() controleert vooraf het doel.
  • raise FileExistsError(...) stopt met een expliciete fout als een doel inmiddels bestaat. flush() schrijft de logregel direct door naar het bestandsobject.
  • Het script bouwt eerst een volledig plan. Een bestaand doel stopt de uitvoering voordat het hernoemen begint.
  • {nummer:03d} maakt volgnummers met drie cijfers. suffix bewaart de laatste extensie.
  • Het log registreert iedere geslaagde wijziging. Dit is geen automatische herstelprocedure: bij een onderbreking kan een deel al hernoemd zijn. Gebruik de testmap zonder andere programma’s die er tegelijk bestanden in wijzigen.
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 een script dat alleen bestanden direct in invoer hernoemt met patroon
2026-05-01_document_001 plus de oorspronkelijke extensie in kleine letters.
Sorteer op oorspronkelijke naam. Gebruik eerst TESTMODUS = True en toon alle
oude en nieuwe namen. Controleer vooraf alle doelpaden en stop bij ieder
conflict, ook als een doel een bronbestand is. Verwerk geen symbolische
links. Schrijf bij echte uitvoering een hernoemlog.csv buiten invoer.
Gebruik pathlib en csv en leg uit hoe ik de testmodus uitzet.

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 hernoemen.py. Neem de code over of vergelijk haar met het antwoord van AI.

from pathlib import Path
import csv

BASIS = Path(__file__).resolve().parent
INVOER = BASIS / "invoer"
TESTMODUS = True
DATUM = "2026-05-01"
CATEGORIE = "document"

def main():
    if not INVOER.is_dir():
        print(f"Map ontbreekt: {INVOER}")
        return
    bestanden = sorted(p for p in INVOER.iterdir() if not p.is_symlink() and p.is_file())
    plan = []
    for nummer, bron in enumerate(bestanden, start=1):
        doel = INVOER / f"{DATUM}_{CATEGORIE}_{nummer:03d}{bron.suffix.lower()}"
        if doel.exists():
            print(f"Gestopt: doel bestaat al: {doel.name}")
            return
        plan.append((bron, doel))
    for bron, doel in plan:
        print(f"{bron.name} -> {doel.name}")
    if TESTMODUS:
        print("Alleen een voorbeeld; er is niets hernoemd.")
        return
    with (BASIS / "hernoemlog.csv").open("w", newline="", encoding="utf-8") as bestand:
        schrijver = csv.writer(bestand)
        schrijver.writerow(["oude_naam", "nieuwe_naam"])
        for bron, doel in plan:
            if doel.exists():
                raise FileExistsError(f"Doel bestaat inmiddels: {doel}")
            bron.rename(doel)
            schrijver.writerow([bron.name, doel.name])
            bestand.flush()
    print("Hernoemen klaar. Bekijk hernoemlog.csv.")

if __name__ == "__main__":
    main()
07 - Het script uitvoeren
  • Sla de volledige code op als hernoemen.py in je projectmap. Zet eventuele invoerbestanden op de plek die in blok 03 staat.
  • Open de geïntegreerde terminal in die projectmap en activeer .venv als dat nog niet is gebeurd.
  • Voer het script uit met:
python hernoemen.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
  • Start met TESTMODUS = True: alle drie de oude namen blijven bestaan.
  • Controleer de voorgestelde namen, zet daarna TESTMODUS = False en voer opnieuw uit. Je krijgt drie nieuwe namen en drie regels in het log.
  • Start nogmaals: het script stopt omdat doelen al bestaan. Test een conflict ook in een verse oefenmap met een vooraf aangemaakt doelbestand.
09 - Fouten herkennen en oplossen
  • Het script stopt bij een bestaand doel? Dat is de bedoelde controle. Begin voor een nieuwe proef met verse kopieën.
  • PermissionError? Sluit geopende bestanden. Lees na een onderbroken uitvoering het log voordat je opnieuw begint.
10 - Uitbreiden en afronden

Probeer deze vervolgstap pas als de basis werkt:

Vraag AI om een controle op lege of ongeldige categorieën en om een bevestigingsvraag vóór het echte hernoemen. Laat de controle op bestaande namen behouden.

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.