Bestanden en excepties in Python

Leer Pythonprogramma’s met bestanden te laten werken en fouten af te handelen. Lees tekstbestanden in hun geheel of regel voor regel, schrijf tekst en voeg tekst veilig toe met with-instructies, en vind bestanden met relatieve en absolute paden en pathlib. Lees en schrijf CSV-gegevens met de module csv, ook met rijen als dictionary’s. Vang daarna verwachte fouten op met try en except, gebruik else en finally, werp je eigen excepties op met duidelijke meldingen en bouw programma’s die ontbrekende bestanden en ongeldige gegevens melden in plaats van vast te lopen.

BeginnerLes 8 van 10 in Cursus Inleiding tot programmeren met Python

Wat je leert

  1. Open tekstbestanden, lees hun inhoud op een manier die bij de taak past, schrijf tekst en voeg tekst toe zonder gegevens te verliezen, en verwerk een bestand regel voor regel om te zoeken, tellen en filteren.
    • Open een tekstbestand en lees de inhoud
      Gebruik open() om een programma met een tekstbestand te verbinden, kies de juiste manier om het te lezen en zet de gelezen tekst om in bruikbare gegevens.
    • Sluit bestanden automatisch met de with-instructie
      Gebruik with open(...) as f: zodat bestanden op het juiste moment worden gesloten, ook als er iets misgaat.
    • Schrijf tekst naar bestanden en voeg tekst toe
      Kies de juiste modus om een bestand te maken, te overschrijven of uit te breiden, en schrijf tekst met write() en print() zodat de regels er precies zo uitzien als bedoeld.
    • Doorzoek, tel en filter regels in een bestand
      Verwerk een bestand regel voor regel om de benodigde regels te vinden, ze te tellen of op te tellen en de resultaten naar een nieuw bestand te schrijven.
  2. Vertel Python precies waar een bestand staat, begrijp waarom een programma een bestaand bestand soms niet kan vinden en stel paden samen die werken op Windows, macOS en Linux.
    • Gebruik relatieve en absolute paden correct
      Schrijf absolute en relatieve paden, weet vanuit welke map een relatief pad begint en vermijd de valkuilen van backslashes in Windowspaden.
    • Stel paden samen en beheer mappen met pathlib
      Gebruik Path-objecten uit de module pathlib om paden samen te voegen, te bekijken en te controleren, bestanden te vinden, mappen aan te maken en kleine bestanden in één stap te lezen of te schrijven.
  3. Gebruik de Pythonmodule csv om tabelgegevens uit CSV-bestanden te lezen, ze om te zetten in getallen en resultaten terug te schrijven als CSV die spreadsheetprogramma’s kunnen openen.
    • Lees CSV-gegevens met csv.reader
      Begrijp hoe een CSV-bestand een tabel opslaat, lees het rij voor rij met csv.reader, sla de kopregel over en converteer de waarden die je nodig hebt.
    • Schrijf CSV-bestanden met csv.writer
      Maak CSV-bestanden van lijsten met csv.writer, zodat komma’s, aanhalingstekens en regelafsluitingen correct worden verwerkt.
    • Benader kolommen via hun naam met DictReader en DictWriter
      Lees elke CSV-rij als een dictionary met de kolomnamen uit de kopregel als sleutels, filter rijen en vat ze samen op kolomnaam, en schrijf dictionary’s terug naar CSV.
  4. Herken de excepties die Python opwerpt, lees een stacktrace om de oorzaak te vinden, vang de fouten op die je verwacht en laat een programma doorlopen of stop het met een duidelijke melding in plaats van het te laten vastlopen.
    • Herken veelvoorkomende excepties en lees een stacktrace
      Weet wat een exceptie is, lees een stacktrace van onder naar boven en noem de veelvoorkomende exceptietypen met hun gebruikelijke oorzaken.
    • Vang excepties op met try en except
      Schrijf try- en except-blokken die de specifieke fouten opvangen die je verwacht, de gebruiker een bruikbare melding geven en onverwachte fouten zichtbaar laten worden.
    • Gebruik else en finally en volg excepties door functies heen
      Vul een try-instructie aan met else en finally, voorspel in welke volgorde de blokken worden uitgevoerd en bepaal in welke functie een exceptie moet worden afgehandeld.
    • Zorg voor gecontroleerde foutafhandeling in programma’s die bestanden en gegevens verwerken
      Combineer bestandsverwerking en exceptieafhandeling zodat ontbrekende bestanden, geblokkeerde bestanden en ongeldige gegevens leiden tot duidelijke meldingen, overgeslagen rijen of een gecontroleerde stop in plaats van een vastgelopen programma.
  5. Gebruik raise om te voorkomen dat een functie doorgaat met ongeldige invoer, kies passende exceptietypen en meldingen en geef fouten door of zet ze om in duidelijkere fouten.
    • Werp excepties op om ongeldige invoer af te wijzen
      Gebruik de raise-instructie om aan te geven dat een functie een waarde heeft ontvangen waarmee ze niet kan werken, en laat de aanroepende code beslissen hoe erop wordt gereageerd.
    • Werp excepties opnieuw op, koppel ze en definieer je eigen excepties
      Geef een exceptie door nadat je erop hebt gereageerd, zet een onderliggende fout om in een duidelijkere fout en maak je eigen exceptietypen voor problemen die specifiek zijn voor je programma.

Bestanden en excepties in Python: uitleg

5 hoofdstukken

1

Lees en schrijf tekstbestanden

Met bestanden kan een programma informatie tussen uitvoeringen bewaren en werken met gegevens die elders zijn verzameld. Door te lezen haal je tekst in het geheugen; door te schrijven bewaar je resultaten voor de volgende uitvoering of voor iemand anders. Je kiest een leesmethode, bepaalt precies wat er wordt geschreven en gebruikt inspringing om bestanden alleen open te houden zolang ze nodig zijn. Voorbeelden die regels een voor een verwerken, combineren daarna stringbewerkingen, keuzes en tellers om ruwe tekst om te zetten in bruikbare resultaten.

1.1 Tekst in een programma lezen

Een tekstbestand bewaart informatie nadat een programma stopt. Python gebruikt een bestandsobject, teruggegeven door open(), om met die informatie te werken. Openen verbindt het programma met het bestand; een leesbewerking haalt de tekst op.

Kies wat je leest

De standaardmodus is "r", voor lezen. Een losse naam wordt opgezocht in de huidige werkmap. Als het bestand daar ontbreekt, werpt open() FileNotFoundError op.

with open("fruit.txt", encoding="utf-8") as f:
    text = f.read()

Stel dat het bestand drie regels heeft, “apple”, “banana” en “cherry”, allemaal met een regelafsluiting. text is 'apple\nbanana\ncherry\n'. De escapesequentie \n stelt één regeleindeteken voor. Een laatste regel kan ook zonder regeleindeteken eindigen.

BewerkingResultaatHandig wanneer
f.read()Alle resterende tekst als één stringJe een klein bestand in zijn geheel nodig hebt
f.readline()De volgende regel als stringJe nu één regel nodig hebt
f.readlines()Alle resterende regels als lijstJe de regels opnieuw wilt gebruiken
for line in f:Eén regel per iteratieJe regels op volgorde kunt verwerken

readline() geeft '' terug aan het einde van het bestand. Een lege regel met een regelafsluiting geeft '\n' terug, dus een lege regel en het einde van het bestand zijn verschillend.

Houd de positie bij

Door te lezen gaat de bestandspositie vooruit. Nadat f.read() het bestand heeft uitgelezen, geeft een volgende aanroep '' terug; een lus over datzelfde object heeft niets meer te lezen. Open het bestand opnieuw om opnieuw te beginnen, of bewaar de benodigde tekst of regels in een variabele. read() en readlines() laden de rest van het bestand in het geheugen. Door rechtstreeks over het bestand te lopen, kun je een groot bestand regel voor regel verwerken.

Regels behouden hun regeleindetekens. print(line) voegt zelf een regeleindeteken toe, waardoor extra lege regels op het scherm kunnen ontstaan. Gebruik print(line, end="") om de oorspronkelijke regelafstand te behouden, of verwijder de regelafsluiting vóór het afdrukken. line.rstrip("\n") verwijdert regeleindetekens aan het einde; line.strip() verwijdert ook spaties aan beide uiteinden.

Zet tekst om in getallen

Zelfs cijfers komen binnen als strings. Dit bestand bevat de scores “72”, “85” en “90”:

scores = []
with open("scores.txt", encoding="utf-8") as f:
    for line in f:
        scores.append(int(line))
total = sum(scores)
print(total, round(total / len(scores), 2))

De lijst is [72, 85, 90], dus drukt het programma 247 82.33 af. int() accepteert spaties en regeleindetekens rondom de waarde. Een lege string of een woord zoals "forty" werpt ValueError op.

Lees tekens met de juiste tekencodering

Een tekencodering koppelt tekens aan opgeslagen bytes. UTF-8 kan tekens zoals “é” en emoji weergeven. Gebruik voor UTF-8-bestanden expliciet encoding="utf-8". Python 3.15 schakelt standaard de UTF-8-modus in; oudere installaties kunnen een lokale tekencodering gebruiken. Een onjuiste tekencodering kan verminkte tekst of UnicodeDecodeError opleveren. Een expliciete tekencodering zet een bestand dat met een andere codering is opgeslagen niet om naar UTF-8.

Het with-blok sluit het bestand wanneer het eindigt. Een gesloten bestand kan niet worden gelezen: een volgende f.read() werpt ValueError op.

Belangrijkste punten

  • open() geeft een bestandsobject terug; lezen haalt tekst op vanaf de huidige positie.
  • Kies een string, een lijst met regels of een lus die regels een voor een verwerkt, passend bij de taak.
  • Het einde van een bestand geeft ''; een lege regel kan '\n' geven.
  • Zet numerieke tekst vóór het rekenen om met int() of float().
  • Gebruik de tekencodering die bij het bestand past en sluit het als je klaar bent.

1.2 Bestanden die sluiten wanneer het blok eindigt

Een open bestand gebruikt bronnen van het besturingssysteem. Tekst die wordt geschreven, kan ook in een buffer in het geheugen wachten voordat die het bestand bereikt. Sluiten geeft de bronnen vrij en schrijft de gebufferde uitvoer weg. Een with-instructie regelt dat opruimen op een duidelijke plek in de code.

Lees binnen het blok, gebruik het resultaat daarna
with open("notes.txt", encoding="utf-8") as f:
    text = f.read()
print(len(text))

De dubbele punt begint het blok. De ingesprongen regel wordt uitgevoerd terwijl f open is. Wanneer de uitvoering de niet-ingesprongen print() bereikt, is het bestand gesloten, maar blijft text een gewone string. De naam f verwijst nog steeds naar het bestandsobject; f.closed is nu True.

Hetzelfde patroon werkt voor een lijst:

with open("fruit.txt", encoding="utf-8") as f:
    lines = f.readlines()
for line in lines:
    print(line.strip().upper())

De lus gebruikt gegevens die al in lines zijn ingelezen. Als je f.readlines() buiten het blok zou plaatsen, zou die proberen een gesloten bestand te lezen en ValueError opwerpen.

Opruimen wanneer het uitvoeringsverloop verandert

Bekijk een functie die de eerste regel teruggeeft:

def first_line(path):
    with open(path, encoding="utf-8") as f:
        return f.readline().rstrip("\n")

De retourwaarde wordt binnen het blok voorbereid. Python verlaat daarna het blok en sluit het bestand voordat de aanroepende code die waarde ontvangt. Het bestand sluit ook wanneer een exceptie het blok verlaat. Een handmatige f.close() na een instructie die een fout veroorzaakt, zou nooit worden bereikt.

Bestandsobjecten ondersteunen dit gedrag omdat het contextbeheerders zijn: objecten die de voorbereiding en het opruimen rond een with-blok regelen. Je kunt dat gedrag gebruiken zonder zelf een contextbeheerder te schrijven.

Open samen een invoer- en een uitvoerbestand
with open("in.txt", encoding="utf-8") as src, open("out.txt", "w", encoding="utf-8") as dst:
    for line in src:
        dst.write(line.upper())

Elke invoerregel wordt omgezet naar hoofdletters en naar de uitvoer geschreven. Beide bestanden sluiten wanneer het blok eindigt. Als de tweede opening mislukt, wordt het eerste bestand, dat al door with is geopend, gesloten wanneer Python de instructie verlaat.

Opruimen en foutherstel hebben verschillende taken

with vangt geen bestandsfouten op. Als open() notes.txt niet kan vinden, werpt de functie FileNotFoundError op voordat de inhoud van het blok wordt uitgevoerd. Als het omzetten van een regel met int() binnen het blok mislukt, sluit het bestand en wordt de exceptie verder naar buiten doorgegeven. Voor herstel of het tonen van een melding is een overeenkomende except-clausule nodig.

Een ontbrekende dubbele punt aan het einde van de with-regel veroorzaakt SyntaxError.

Belangrijkste punten

  • with sluit een geopend bestand bij normaal verlaten, bij terugkeer en wanneer een exceptie het blok verlaat.
  • Opgeslagen strings en lijsten blijven bruikbaar nadat het bestand is gesloten.
  • De inspringing geeft aan hoelang het bestand open is.
  • Opruimen vangt geen exceptie op; voor herstel zijn try en except nodig.

1.3 Tekst maken, vervangen en toevoegen

Schrijven begint met een keuze over bestaande gegevens. De modus bepaalt of Python een bestand leest, vervangt, uitbreidt of aanmaakt. Maak die keuze voordat je open() aanroept, want vervangen gebeurt onmiddellijk.

Kies de modus
ModusBestaand bestandOntbrekend bestand
"r"Opent om te lezenWerpt FileNotFoundError op
"w"Maakt leeg en opent om te schrijvenMaakt het aan
"a"Voegt uitvoer toe aan het eindeMaakt het aan
"x"Werpt FileExistsError opMaakt het aan

Als je de enige kopie van belangrijke gegevens opent met "w", vernietig je de oude inhoud, zelfs als er geen write() volgt. Gebruik een apart uitvoerbestand terwijl je leert gegevens te transformeren. "x" is handig wanneer het vervangen van een bestaand bestand moet worden geweigerd.

Door "b" toe te voegen, zoals in "rb", kies je de binaire modus voor ruwe bytes. Tekstmodi werken met strings en een tekencodering; binaire modi accepteren geen encoding-argument.

Bepaal waar regels eindigen
with open("todo.txt", "w", encoding="utf-8") as f:
    f.write("buy milk\n")
    f.write("call Sam\n")

Het bestand heeft de twee regels “buy milk” en “call Sam”. write() voegt precies de opgegeven string toe, zonder automatisch scheidingsteken. Zonder de regeleindetekens zou het bestand "buy milkcall Sam" op één regel bevatten.

write() geeft het aantal geschreven tekens terug. Zo geeft f.write("Ana,92\n") 7 terug. Dat is een aantal tekens, niet noodzakelijk het aantal gecodeerde bytes op schijf. De methode accepteert een string; f.write(42) werpt TypeError op. Zet een getal eerst om, bijvoorbeeld met f.write(f"{score}\n").

Vergelijk de hulpmiddelen voor uitvoer

print() kan naar een bestand schrijven:

with open("total.txt", "w", encoding="utf-8") as f:
    print("Total:", 247, file=f)

De uitvoertekst is "Total: 247\n". print() zet zijn argumenten om, scheidt ze met spaties en voegt standaard aan het einde een regeleindeteken toe.

writelines() krijgt een sequentie van strings, maar voegt geen regelafsluitingen in. f.writelines(["a", "b"]) schrijft "ab". Om één element per regel te krijgen, neem je een regeleindeteken op in elke string, of voeg je de strings samen met "\n" en voeg je aan het einde een regeleindeteken toe.

Bewaar eerdere uitvoeringen
with open("log.txt", "a", encoding="utf-8") as f:
    f.write("Program started\n")

Als er aanvankelijk geen bestand is, leveren twee uitvoeringen twee regels op. Met "w" zou elke uitvoering de eerdere regel vervangen. De toevoegmodus vult geen ontbrekend regeleindeteken aan: als de bestaande tekst midden op een regel eindigt, begint de nieuwe tekst er direct achter.

Voor een rapport doorloop je paren zoals [("Ana", 92), ("Ben", 78)] en schrijf je f"{name}: {score}\n". De opmaak gebeurt vóór het schrijven, dus f"{82.333:.1f}" levert de tekst "82.3" op. Daarna sluit with de uitvoer en schrijft de gebufferde tekst weg aan het einde van het blok.

Belangrijkste punten

  • "w" maakt een bestaand bestand leeg zodra het wordt geopend.
  • "a" voegt toe aan het einde; "x" weigert een bestaand bestand te vervangen.
  • write() krijgt een string en voegt geen regeleindeteken toe.
  • print(..., file=f) zet waarden om en voegt standaard een regeleindeteken toe.
  • writelines() schrijft strings achter elkaar zonder scheidingstekens toe te voegen.
  • Binaire modi lezen of schrijven bytes en accepteren geen argument voor de tekencodering.

1.4 Bruikbare regels vinden en opslaan

Veel bestandstaken bestaan uit een lus met een keuze erin. Lees een regel, verwijder ongewenste witruimte, bepaal of de regel van belang is en werk een resultaat bij. Door deze stappen gescheiden te houden, maak je een programma gemakkelijker te controleren.

Doorloop een logbestand

Stel dat server.log deze records bevat, met een lege regel vóór het laatste record:

2026-03-01 08:14 INFO Server started
2026-03-01 08:20 ERROR Disk almost full
2026-03-01 09:02 INFO User login: maya
2026-03-01 09:15 WARNING Slow response
2026-03-01 10:40 ERROR Database timeout

2026-03-01 11:05 INFO Backup finished

Elk niet-leeg record heeft een datum, tijd, niveau en bericht. Splits slechts drie keer om het bericht bij elkaar te houden:

errors = 0
with open("server.log", encoding="utf-8") as f:
    for line in f:
        line = line.strip()
        if not line:
            continue
        parts = line.split(maxsplit=3)
        if parts[2] == "ERROR":
            errors += 1
            print(parts[3])
print(errors, "errors")

Voor het tweede record is parts[2] gelijk aan "ERROR" en parts[3] aan "Disk almost full". Dat bericht wordt afgedrukt en de teller stijgt naar 1. De latere fout verhoogt de teller naar 2. Het programma drukt beide berichten af en daarna “2 errors”.

Controleer het bedoelde deel
ControleWat wordt gevraagd
line.startswith("From:")Begint de regel met deze tekst?
"ERROR" in lineKomt deze tekst ergens voor?
line.find("ERROR")Waar komt de tekst voor het eerst voor, of is het resultaat -1?
parts[2] == "ERROR"Is dit specifieke veld precies het foutniveau?

Overal zoeken zou ook overeenkomen met “INFO No ERRORS today”. Controle van het niveauveld beantwoordt de vraag over het logbestand nauwkeuriger.

Na strip() is een lege regel ""; splitsen levert [] op. Als je dan parts[2] met een index benadert, wordt IndexError opgeworpen. De continue slaat die regel over voordat een index wordt gebruikt. Een niet-leeg maar onvolledig record vereist ook een lengtecontrole wanneer zulke records mogelijk zijn.

Tel categorieën of schrijf een gefilterd bestand

Een dictionary bevat een telling per niveau. Stel voor elk record level = parts[2] in en daarna counts[level] = counts.get(level, 0) + 1. Voor het logbestand hierboven zijn de tellingen {'INFO': 3, 'ERROR': 2, 'WARNING': 1}. De standaardwaarde 0 begint een categorie wanneer die voor het eerst verschijnt.

Om overeenkomende records op te slaan, open je een apart doelbestand in dezelfde with-instructie en schrijf je een regel wanneer het niveau overeenkomt. Bewaar de oorspronkelijke line als de witruimte van belang is; als je opgeschoonde tekst schrijft, voeg dan het regeleindeteken weer toe. Open het bronbestand zelf nooit met "w": het zou worden leeggemaakt voordat het lezen begint.

Maak onzichtbare tekens zichtbaar

print(repr(line)) maakt spaties en regeleindetekens aan het einde zichtbaar, bijvoorbeeld 'Disk full \n'. strip() verwijdert beide, terwijl rstrip("\n") de spaties behoudt. Bij gewoon lezen als tekst worden herkende regelafsluitingen van Windows, Unix en oude Macsystemen omgezet naar "\n". Een laatste regel zonder afsluiting blijft zonder afsluiting. Met een bestandsnaam die via input("File name: ").strip() wordt opgehaald, werkt dezelfde lus voor verschillende invoerbestanden.

Belangrijkste punten

  • Schoon op, selecteer, verwerk en rapporteer in afzonderlijke stappen.
  • Sla lege regels over voordat je gesplitste velden met een index benadert.
  • Controleer het bedoelde veld wanneer zoeken in de hele regel te veel overeenkomsten kan opleveren.
  • Gebruik een dictionary om per categorie een teller bij te houden.
  • Schrijf gefilterde uitvoer naar een ander bestand.
  • repr() maakt spaties en regeleindetekens zichtbaar die bij gewoon afdrukken verborgen blijven.
2

Vind bestanden met paden

Een juiste bestandsnaam is slechts een deel van een locatie. De map waarin een programma start, beïnvloedt relatieve paden en kan verschillen van de map waarin het script staat. Je volgt paden door een mappenboom, voorkomt escapesequenties in Windowsstrings en stelt locaties samen met pathlib. Deze vaardigheden helpen fouten door ontbrekende bestanden te verklaren en laten hetzelfde project op verschillende computers zijn gegevens vinden en uitvoermappen voorbereiden.

2.1 Waar Python naar een bestand zoekt

Een pad beschrijft een locatie in een mappenboom. Het kan beginnen bij de wortel van die boom of bij de huidige werkmap van het programma. Een bestand kan op de computer bestaan en toch ontbreken op de locatie waar je programma om vraagt.

Lees een pad vanaf het beginpunt
SoortVoorbeeldBeginpunt
Absoluut, macOS of Linux/Users/maya/data/notes.txtDe wortel /
Absoluut, WindowsC:/Users/Maya/data/notes.txtDe wortel van schijf C
Relatiefdata/notes.txtHuidige werkmap

Stel dat een map met de naam project een map scripts en een map data bevat. Je voert python scripts/report.py uit terwijl je in project werkt. Het openen van "data/notes.txt" zoekt in project/data, ook al staat het script in project/scripts.

Als je hetzelfde script daarentegen start terwijl je in project/scripts werkt, verwijst dat relatieve pad naar een locatie in project/scripts/data. Het script is niet verplaatst; het beginpunt is veranderd.

from pathlib import Path
print(Path.cwd())

Dit drukt de huidige werkmap af. os.getcwd() na import os geeft dezelfde informatie als string. Editors en hulpmiddelen om programma’s te starten kunnen een werkmap kiezen, dus bekijk die wanneer de locatie onduidelijk is.

Doorloop mappen

In een relatief pad betekent . de huidige map en .. de bovenliggende map. Vanuit project/scripts gaat ../data/notes.txt omhoog naar project en daarna omlaag naar data. Als je .. toevoegt zonder de beginmap te controleren, kan een programma op de verkeerde locatie terechtkomen.

Een absoluut pad is handig om één exacte locatie aan te geven, maar een pad zoals C:/Users/Maya/Desktop/data.csv bindt gedeelde code aan de mappen van één persoon. Gebruik een relatief pad met een duidelijk beginpunt, of stel het pad samen vanuit de eigen map van het script wanneer de gegevens daar thuishoren.

Houd backslashes van Windows intact

Windows toont gewoonlijk backslashes tussen mappen. In een gewone Pythonstring begint een backslash een escapesequentie: \n wordt een regeleindeteken en \t een tab. De letterlijke waarde "C:\new\table.txt" bevat daarom niet het pad dat je bedoelde.

Deze vormen behouden het bedoelde pad:

raw = r"C:\new\table.txt"
escaped = "C:\\new\\table.txt"
forward = "C:/new/table.txt"

Python op Windows accepteert schuine strepen. Een ruwe string voorkomt dat backslashes escapesequenties worden, maar kan niet eindigen op één enkele backslash. Zo is r"C:\data\" ongeldige syntaxis.

Controleer zowel de naam als de map

Let op verschillen in spelling en verborgen extensies: een bestand dat wordt weergegeven als “notes.txt” kan in werkelijkheid “notes.txt.txt” heten. Ook hoofdletters en kleine letters zijn van belang. Linux maakt meestal onderscheid tussen Data.csv en data.csv; de gebruikelijke instellingen van Windows en macOS doen dat niet. Door de werkelijke hoofdletters en kleine letters over te nemen, blijft een project op verschillende systemen bruikbaar.

Belangrijkste punten

  • Relatieve paden beginnen vanuit de huidige werkmap.
  • De werkmap kan verschillen van de map van het script.
  • . blijft in de huidige map; .. gaat naar de bovenliggende map.
  • Gebruik ruwe strings, dubbele backslashes of schuine strepen voor Windowspaden.
  • Controleer exacte namen, extensies en hoofdletters en kleine letters wanneer een bestand ontbreekt.

2.2 Paden samenstellen met pathlib

De standaardmodule pathlib geeft een pad een eigen object. Met een Path kun je mapnamen samenvoegen, een bestandsnaam bekijken en veelvoorkomende bestandstaken uitvoeren zonder handmatig strings met scheidingstekens samen te stellen.

Voeg samen en bekijk
from pathlib import Path
p = Path("reports") / "2026" / "sales.csv"
print(p.name)
print(p.stem)
print(p.suffix)
print(p.parent)

De eerste drie resultaten zijn “sales.csv”, “sales” en “.csv”. De bovenliggende map is het pad reports/2026, weergegeven met het scheidingsteken van het systeem. Hier voegt / padonderdelen samen; de operator deelt geen getallen. Het oudere os.path.join() voegt ook padonderdelen als strings samen.

Een Path beschrijft een locatie, ook voordat daar iets bestaat. p.exists() controleert of er iets op die locatie bestaat. p.is_file() en p.is_dir() maken onderscheid tussen een bestand en een map. Een controle op bestaan kan niet garanderen dat later openen lukt: het bestand kan verdwijnen of de toegang kan tussen die bewerkingen veranderen. Handel openingsfouten af wanneer het programma moet kunnen herstellen.

Lees of schrijf een klein bestand

open() accepteert direct een Path. Voor een klein bestand regelen deze hulpmethoden ook het openen en sluiten:

p = Path("greeting.txt")
p.write_text("Hello\n", encoding="utf-8")
text = p.read_text(encoding="utf-8")

text wordt "Hello\n". write_text() vervangt bestaande inhoud, net als openen met "w"; het is geen hulpmethode om tekst toe te voegen. read_text() laadt het hele bestand, dus gebruik een bestandslus wanneer je een groot bestand regel voor regel moet verwerken.

Begin vanuit de map van het script

Een gegevensbestand dat naast een script wordt meegeleverd, moet vanuit dat script worden gevonden, onafhankelijk van de werkmap:

base = Path(__file__).resolve().parent
scores_path = base / "data" / "scores.txt"
with open(scores_path, encoding="utf-8") as f:
    scores = f.readlines()

__file__ duidt het scriptbestand aan. resolve() maakt het pad absoluut en parent selecteert de map waarin het staat. In een interactieve shell is __file__ niet gedefinieerd, dus hoort dit patroon in een script thuis.

Vind bestanden en bereid uitvoermappen voor
for p in sorted(Path("logs").glob("*.txt")):
    text = p.read_text(encoding="utf-8")
    print(p.name, len(text.splitlines()))

glob("*.txt") selecteert overeenkomende paden in logs. iterdir() levert de inhoud van de map zonder dat patroon als filter. Sorteren maakt de volgorde voorspelbaar. splitlines() telt de tekstregels zonder de laatste regelafsluiting als een extra lege regel te behandelen.

Schrijven maakt een bestand aan, maar geen ontbrekende bovenliggende mappen. Maak die eerst aan:

folder = Path("output") / "daily"
folder.mkdir(parents=True, exist_ok=True)
(folder / "report.txt").write_text("Ready\n", encoding="utf-8")

parents=True maakt ontbrekende mappen boven daily aan. exist_ok=True accepteert een map die al bestaat. Het verandert een bestaand gewoon bestand niet in een map.

Belangrijkste punten

  • Path voegt onderdelen samen met / en werkt rechtstreeks met open().
  • name, stem, suffix en parent geven toegang tot verschillende onderdelen van een pad.
  • Een controle op bestaan kan niet garanderen dat later openen lukt.
  • read_text() leest alle tekst; write_text() vervangt die.
  • Stel paden samen vanuit Path(__file__).resolve().parent voor gegevens ten opzichte van het script.
  • Gebruik glob() om overeenkomsten te vinden en mkdir() om ontbrekende mappen aan te maken.
3

Lees en schrijf CSV-bestanden

Tabelgegevens hebben meer structuur nodig dan een verzameling regels. Een naam kan een komma bevatten, een veld kan een regeleinde bevatten en een hoeveelheid komt nog steeds als tekst binnen. Je gebruikt de CSV-module om die grenzen te behouden, waarden voor berekeningen om te zetten en resultaten te schrijven die een ander programma kan lezen. Benoemde kolommen maken de verwerking duidelijker, terwijl controles op kopregels en rijindelingen onvolledige gegevens helpen blootleggen.

3.1 CSV-rijen en -velden lezen

Een CSV-bestand slaat een tabel op als tekst. De records zijn rijen en de velden zijn kolomwaarden. Komma’s scheiden gewoonlijk de velden, maar velden tussen aanhalingstekens kunnen komma’s en zelfs regeleinden bevatten. Gebruik de module csv om die waarden bij elkaar te houden.

Laat een lezer aanhalingstekens verwerken
name,quiz1,quiz2
Ana,8,9
Ben,7,6
"Lopez, Maria",10,8

De eerste rij is een kopregel met kolomnamen. De laatste gegevensrij heeft drie velden, geen vier: de komma binnen de aangehaalde naam hoort bij de naam. Een dubbel aanhalingsteken binnen een veld tussen aanhalingstekens wordt tweemaal geschreven. Als je elke regel met split(",") zou splitsen, zou je die regels negeren en de naam in stukken breken.

import csv
with open("grades.csv", newline="", encoding="utf-8") as f:
    reader = csv.reader(f)
    header = next(reader)
    for row in reader:
        average = (int(row[1]) + int(row[2])) / 2
        print(row[0], average)

De lezer geeft lijsten met strings terug. next(reader) leest de kopregel één keer, waarna de lus de gegevens kan verwerken. Het programma drukt “Ana 8.5”, “Ben 6.5” en “Lopez, Maria 9.0” af. In de eerste gegevensrij levert het omzetten van "8" en "9" samen 17 op; delen door 2 geeft daarna 8,5.

Stem bestandsverwerking en tabelinterpretatie op elkaar af

Open CSV-bestanden met newline="", zodat de module csv zelf regelafsluitingen verwerkt. Dit is van belang wanneer een veld tussen aanhalingstekens een regeleinde bevat. Eén CSV-record kan meerdere fysieke bestandsregels beslaan, dus regels afzonderlijk splitsen is geen vervanging voor een CSV-lezer.

De lezer laat waarden standaard als strings staan. Zonder conversie voegt row[1] + row[2] de strings "8" en "9" samen tot "89". Als je vergeet de kopregel over te slaan, probeert het programma "quiz1" om te zetten en werpt het ValueError op.

Als een bestand leeg kan zijn, leest next(reader, None) een kopregel als die aanwezig is en geeft anders None terug. Een volledig lege CSV-regel wordt []. Sla zulke rijen over met if not row: continue voordat je een index gebruikt. Een niet-lege rij met te weinig velden vereist ook een lengtecontrole; alleen lege rijen overslaan beschermt row[2] niet tegen elk kort record.

Sluit aan bij de opmaak van het bestand
reader = csv.reader(f, delimiter=";", skipinitialspace=True)

Dit kiest puntkomma’s als scheidingstekens en verwijdert spaties direct erna. Kies het scheidingsteken dat het bestand daadwerkelijk gebruikt; een ander scheidingsteken kiezen zet decimale komma’s niet om in decimale punten. float("2,50") werpt nog steeds ValueError op.

Sommige exportbestanden uit spreadsheetprogramma’s beginnen met een UTF-8-bytevolgordemarkering. Als je zo’n bestand leest met encoding="utf-8", kan "\ufeff" aan het begin van het eerste veld blijven staan, waardoor de kop "name" verandert in "\ufeffname". Voor die opmaak verwijdert encoding="utf-8-sig" de markering; hiermee kun je ook UTF-8-bestanden zonder markering lezen.

Belangrijkste punten

  • Een CSV-record kan komma’s of regeleinden tussen aanhalingstekens bevatten.
  • Gebruik csv.reader in plaats van gewoon op komma’s te splitsen, zodat aanhalingstekens correct worden verwerkt.
  • Open CSV-bestanden met newline="" en een passende tekencodering.
  • De standaardlezer geeft strings terug; sla een kopregel over vóór numerieke conversie.
  • Controleer op lege of korte rijen voordat je velden benadert.
  • Kies het juiste scheidingsteken en verwerk een bytevolgordemarkering als die aanwezig is.

3.2 Tabelrijen als CSV schrijven

Een CSV-schrijver zet waarden om in correct gescheiden velden en plaatst ze waar nodig tussen aanhalingstekens. Geef de schrijver rijen als sequenties van waarden en laat hem de leestekens verwerken. Zo voorkom je uitvoer die er goed uitziet totdat een naam of bericht een komma bevat.

Schrijf een kopregel en gegevens
import csv
with open("summary.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["name", "average"])
    writer.writerow(["Ana", 8.5])
    writer.writerow(["Lopez, Maria", 9.0])

Het bestand bevat de rijen name,average, Ana,8.5 en "Lopez, Maria",9.0. De schrijver zet getallen om in tekst. Hij plaatst de naam met een komma tussen aanhalingstekens en verdubbelt elk dubbel aanhalingsteken binnen een veld tussen aanhalingstekens. None wordt een leeg veld, dus als je het bestand terugleest, krijg je None niet automatisch terug.

writerow() krijgt één rij. writerows() krijgt een sequentie van rijen, zoals [["Ana", 8.5], ["Ben", 6.5]]. Als je "Ana" rechtstreeks aan writerow() doorgeeft, krijgt die drie tekens en ontstaat A,n,a. Gebruik ["Ana"] voor een rij met één veld.

Laat CSV de regelafsluitingen regelen

Gebruik newline="" wanneer je het uitvoerbestand opent. De standaardschrijver sluit records af met "\r\n". Als je ook in tekstmodus regeleindetekens laat vertalen, kan Windows een extra wagenterugloop toevoegen, waardoor in sommige lezers ongewenste lege regels ontstaan. Het argument newline voorkomt die tweede omzetting.

Zet het ene bestand om in het andere
with open("grades.csv", newline="", encoding="utf-8") as src, open("summary.csv", "w", newline="", encoding="utf-8") as dst:
    reader = csv.reader(src)
    writer = csv.writer(dst)
    next(reader)
    writer.writerow(["name", "average"])
    for row in reader:
        average = (int(row[1]) + int(row[2])) / 2
        writer.writerow([row[0], round(average, 2)])

Voor de cijferregels “Ana,8,9”, “Ben,7,6” en "Lopez, Maria",10,8 zijn de gemiddelden 8,5, 6,5 en 9,0. De lezer verwijdert de CSV-aanhalingstekens uit de invoerveldwaarde; de schrijver voegt de benodigde aanhalingstekens weer toe aan de uitvoer. round() bepaalt de numerieke waarde die wordt geschreven, maar dwingt geen weergave met twee decimalen af. Gebruik een opmaak zoals f"{average:.2f}" wanneer je precies twee decimalen wilt.

Voeg toe zonder de kopregel te herhalen

Controleer voordat je een bestand opent om tekst toe te voegen of het een kopregel nodig heeft:

from pathlib import Path
p = Path("sales.csv")
needs_header = not p.exists() or p.stat().st_size == 0
with open(p, "a", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    if needs_header:
        writer.writerow(["item", "quantity"])
    writer.writerow(["coffee", 4])

Ook een bestaand leeg bestand heeft een kopregel nodig. Als je de kopregel bij elke uitvoering schrijft, komen kolomnamen midden in de gegevens terecht. Dit patroon gaat ervan uit dat één programma het bestand bijwerkt; een controle op bestaan voorkomt niet dat andere programma’s het bestand wijzigen.

Belangrijkste punten

  • Geef een sequentie van velden door aan writerow() en rijen aan writerows().
  • De schrijver zet waarden om en verwerkt aanhalingstekens; None wordt een leeg veld.
  • Gebruik newline="" zowel voor CSV-uitvoer als voor CSV-invoer.
  • Voeg alleen een kopregel toe wanneer het bestand nieuw of leeg is.

3.3 Kolomnamen gebruiken in CSV-code

Code die op positie werkt, zoals row[2], is afhankelijk van de kolomvolgorde. Met een lezer op basis van dictionary’s kun je de waarde die je nodig hebt bij naam noemen. Een dictionary koppelt sleutels aan waarden; hier levert de kopregel de sleutels en levert elk gegevensrecord de bijbehorende waarden.

Lees velden op naam
import csv
with open("inventory.csv", newline="", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    rows = list(reader)

Voor de kopregel product,stock,price en de rij notebook,12,2.50 is de eerste dictionary {'product': 'notebook', 'stock': '12', 'price': '2.50'}. reader.fieldnames geeft de namen uit de kopregel. De kopregel wordt automatisch ingelezen; een aanroep van next(reader) zou het eerste gegevensrecord overslaan.

Gebruik row["stock"] om de voorraad te selecteren, ook als de kolommen een andere volgorde krijgen. Zet de waarde om met int() om hoeveelheden te vergelijken. De waarden blijven strings; kolomnamen geven de lezer geen numerieke typen.

Filter en tel op

Stel dat de tabel een voorraad van 12 notitieboeken tegen een prijs van 2,50 bevat, 3 pennen tegen 1,20, 0 nietmachines tegen 7,95 en 25 mappen tegen 0,80.

low = [r for r in rows if int(r["stock"]) < 5]
value = sum(int(r["stock"]) * float(r["price"]) for r in rows)

low bevat de rijen voor de pen en de nietmachine. De waarde is € 53,6: de notitieboeken dragen 30 bij, de pennen 3,6, de nietmachines 0 en de mappen 20. Het filter gebruikt de voorraad, terwijl het totaal zowel de voorraad als de prijs gebruikt.

Maak onderscheid tussen ontbrekende sleutels en ontbrekende waarden

Namen in de kopregel moeten precies overeenkomen. Name en name zijn verschillende sleutels. Een spatie na een komma kan onderdeel worden van een kolomnaam; skipinitialspace=True verwijdert spaties direct na scheidingstekens.

Een kopregel name,quiz1,quiz2 met gegevens Ben,7 levert {'name': 'Ben', 'quiz1': '7', 'quiz2': None} op. De sleutel bestaat, maar de waarde ontbreekt. int(None) werpt TypeError op. Een aanwezig leeg veld is "", en omzetting daarvan werpt ValueError op. Een sleutel die niet in de kopregel voorkomt, veroorzaakt daarentegen KeyError bij het opzoeken.

Bij de gegevens Cara,1,2,3 worden extra velden verzameld als None: ['3']; de benoemde velden bevatten nog steeds "Cara", "1" en "2". Controleer de indeling van een rij wanneer nauwkeurige totalen van elk veld afhangen.

Schrijf geselecteerde kolommen
with open("reorder.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["product", "stock"])
    writer.writeheader()
    for r in low:
        writer.writerow({"product": r["product"], "stock": r["stock"]})

fieldnames bepaalt de uitvoervolgorde, ongeacht de volgorde in de dictionary. Ontbrekende dictionarysleutels worden lege velden. Extra sleutels werpen standaard ValueError op: een voorraaddictionary met price doorgeven aan deze schrijver met twee kolommen mislukt. Maak de kleinere dictionary zoals getoond, of kies extrasaction="ignore" wanneer het weglaten van extra velden de bedoeling is.

Belangrijkste punten

  • DictReader leest de kopregel en geeft dictionary’s met stringwaarden terug.
  • Namen in de kopregel moeten precies overeenkomen met de sleutels waarmee je zoekt.
  • Een ontbrekend veld krijgt standaard None; een aanwezig leeg veld is "".
  • Extra velden komen standaard onder de sleutel None terecht.
  • DictWriter heeft fieldnames nodig om de kolomvolgorde te bepalen.
  • Ontbrekende uitvoersleutels worden lege velden; onverwachte sleutels werpen standaard ValueError op.
4

Handel fouten af met try en except

Bestandsnamen kunnen verkeerd zijn, toegang kan worden geweigerd en een numerieke kolom kan een woord bevatten. Een exceptie markeert het punt waarop de normale uitvoering niet kan doorgaan. Je leest foutrapporten, vangt verwachte problemen op en houdt werkzaamheden na succes gescheiden van opruimwerk. Door fouten vervolgens via functieaanroepen te volgen, kun je herstel plaatsen waar een zinvolle keuze mogelijk is, zoals opnieuw proberen te lezen of een afgewezen rij melden.

4.1 Een foutrapport begrijpen

Een exceptie is een object dat tijdens de uitvoering een probleem aangeeft. Het opwerpen ervan onderbreekt de normale uitvoering. Als geen exceptieafhandelaar de exceptie afhandelt, beëindigt Python het programma met een stacktrace, een overzicht van de aanroepen die tot de fout hebben geleid.

Begin onderaan
def average(values):
    return sum(values) / len(values)

def report():
    scores = []
    print(average(scores))

report()

De stacktrace eindigt met ZeroDivisionError: division by zero. Begin daar: het type benoemt het soort probleem en de melding geeft details. Het onderdeel direct daarboven verwijst naar de deling in average(). Eerdere onderdelen tonen de aanroep vanuit report() en de oorspronkelijke aanroep van report(). De lijst is leeg, dus de lengte is 0. De gemelde regel is waar het probleem zichtbaar wordt; de eerdere toekenning van de lege lijst verklaart hoe het ontstond.

Kies het passende type
TypeGebruikelijke oorzaak
ValueErrorint("3.5"): een string met een onaanvaardbare waarde
TypeErrorlen(5): een bewerking op het verkeerde soort object
ZeroDivisionErrorDelen door nul
IndexErrorEen lijstpositie lezen die niet bestaat
KeyErrorEen ontbrekende dictionarysleutel opzoeken
NameErrorEen niet-gedefinieerde naam gebruiken
AttributeErrorEen object om een attribuut vragen dat het niet heeft

int("abc") ontvangt een toegestaan invoertype, een string, maar kan die waarde niet als geheel getal interpreteren. "5" + 3 mengt daarentegen typen die niet bij elkaar kunnen worden opgeteld. Een string die cijfers bevat, blijft een string.

Bestandsbewerkingen hebben specifiekere typen: FileNotFoundError voor een ontbrekend pad, PermissionError voor geweigerde toegang en FileExistsError voor het aanmaken van een bestaand bestand met "x". Een map als gewoon bestand openen kan IsADirectoryError opwerpen. Bytes decoderen met een ongeschikte tekencodering kan UnicodeDecodeError opwerpen.

Begrijp de stamboom

Exceptieklassen vormen een hiërarchie. Een exceptieafhandelaar voor een bovenliggende klasse kan de onderliggende klassen opvangen:

  • OSError is het bovenliggende type van veelvoorkomende bestandssysteemfouten, waaronder FileNotFoundError en PermissionError.
  • LookupError is het bovenliggende type van IndexError en KeyError.
  • ArithmeticError is het bovenliggende type van ZeroDivisionError.
  • UnicodeDecodeError valt onder ValueError.

Deze takken stammen af van Exception, dat afstamt van BaseException. KeyboardInterrupt en SystemExit stammen daarentegen rechtstreeks af van BaseException. Door dat onderscheid laat except Exception onderbreking door de gebruiker en beëindiging van het programma ongemoeid.

Maak onderscheid tussen syntaxis-, uitvoerings- en logische problemen

Een ontbrekende dubbele punt of een ontbrekend sluitend haakje kan verhinderen dat Python een script ontleedt. De daaruit volgende SyntaxError treedt op voordat het script wordt uitgevoerd, dus een try in datzelfde script kan de fout niet opvangen. Een uitvoeringsexceptie treedt op terwijl geldige code wordt uitgevoerd. Een logische fout levert een verkeerd antwoord op zonder noodzakelijkerwijs een exceptie op te werpen, bijvoorbeeld door een totaal door het verkeerde aantal te delen.

Belangrijkste punten

  • Lees eerst het exceptietype en de melding onderaan een stacktrace.
  • Gebruik de vermelde aanroepen om de waarde die de fout veroorzaakt terug te volgen naar de oorsprong.
  • ValueError betreft een onaanvaardbare waarde; TypeError betreft een ongeschikt type.
  • Een exceptieafhandelaar voor een bovenliggende klasse vangt ook onderliggende exceptieklassen op.
  • Syntaxisfouten, uitvoeringsfouten en logische fouten ontstaan op verschillende manieren.

4.2 Een probleem opvangen waar het kan worden afgehandeld

Een try-instructie voert code uit waarbij een fout kan optreden en biedt een herstelpad voor geselecteerde excepties. De exceptieafhandelaar moet passen bij het probleem dat het programma verwacht en waarop het weet te reageren.

Volg het uitvoeringsverloop
while True:
    try:
        age = int(input("Age: "))
        break
    except ValueError:
        print("Please enter a whole number, like 34.")
print("Next year you will be", age + 1)

Als de gebruiker “twenty” typt, werpt int() ValueError op. Python slaat de rest van de try over, inclusief break, en voert de overeenkomende exceptieafhandelaar uit. Daarna vraagt de lus opnieuw om invoer. Als de gebruiker “34” typt, wordt de try voltooid via break, zodat het programma de lus verlaat en “Next year you will be 35” afdrukt.

Een exceptieafhandelaar hervat de uitvoering niet bij de mislukte instructie. De uitvoering gaat verder na de try-instructie, tenzij de exceptieafhandelaar zelf dat verloop verandert. Als geen exceptieafhandelaar overeenkomt, wordt de exceptie verder naar buiten doorgegeven.

Handel verschillende fouten verschillend af
try:
    result = int(a) / int(b)
except ValueError:
    print("Both values must be whole numbers.")
except ZeroDivisionError:
    print("The second value cannot be 0.")

Een mislukte conversie en een deler die nul is, vereisen verschillende meldingen. Als de reactie hetzelfde moet zijn, groepeer je typen in een tuple: except (ValueError, ZeroDivisionError):. Haakjes werken in heel Python 3. Python 3.14 staat ook een lijst zonder haakjes toe wanneer er geen as-gedeelte is; de tuplevorm blijft in alle versies duidelijk.

Python controleert clausules van boven naar beneden en voert de eerste overeenkomst uit. Zet FileNotFoundError vóór het bovenliggende type OSError als een ontbrekend bestand een speciale reactie vereist. Als je ze omdraait, wordt de specifieke exceptieafhandelaar onbereikbaar.

Gebruik de melding zonder andere programmeerfouten te verbergen
try:
    quantity = int(text)
except ValueError as err:
    print("Cannot read quantity:", err)

err is het exceptieobject; als je het afdrukt, zie je de melding. type(err).__name__ geeft de klassenaam. Python verwijdert de binding van err wanneer de exceptieafhandelaar eindigt, dus kopieer de melding binnen het blok naar een andere variabele als je die later nodig hebt.

Houd de try klein. Zet latere berekeningen buiten de conversieafhandeling wanneer fouten daarin een andere behandeling vereisen. except Exception: kan programmeerfouten verbergen, zoals een niet-gedefinieerde variabele. Een kale except: is nog breder: die vangt ook KeyboardInterrupt en SystemExit op.

Probeer de bewerking opnieuw, niet een ruwe benadering ervan

Met text.isdigit() controleer je niet alles wat int() accepteert. "-5" en " 34" doorstaan die controle niet, maar worden wel omgezet; "²" doorstaat de controle wel, maar wordt niet door int() omgezet. Door de conversie te proberen en ValueError op te vangen, gebruik je de eigen regels van de conversie.

Doe iets zichtbaars of leg iets vast wanneer je ongeldige gegevens afhandelt. Een lege except ValueError: pass kan het programma laten doorgaan met ontbrekende resultaten zonder vast te leggen wat er misging.

Belangrijkste punten

  • Een exceptie slaat de resterende try-code over en voert de eerste overeenkomende exceptieafhandelaar uit.
  • Gebruik specifieke typen en zet exceptieafhandelaars voor onderliggende klassen vóór die voor bovenliggende klassen.
  • Groepeer typen in een tuple wanneer de herstelactie voor die typen hetzelfde is.
  • except ... as err geeft binnen de exceptieafhandelaar toegang tot de melding.
  • Houd de try gericht, zodat meldingen de werkelijk mislukte bewerking beschrijven.
  • Probeer numerieke conversie rechtstreeks wanneer je wilt controleren wat die accepteert.

4.3 Succes, opruimen en fouten tussen functies

Een try-instructie kan de bewerking waarbij een fout kan optreden, het herstel, de werkzaamheden na succes en het opruimen van elkaar scheiden. Een exceptie kan ook een functie verlaten en door de aanroepende code worden afgehandeld.

Geef werkzaamheden na succes een eigen blok
try:
    x = 10 / int(text)
except ValueError:
    print("not a number")
except ZeroDivisionError:
    print("zero")
else:
    print("result", x)
finally:
    print("done")

Met text = "4" drukt het programma “result 2.5” en “done” af. Met "abc" drukt het “not a number” en “done” af; met "0" drukt het “zero” en “done” af.

else wordt uitgevoerd wanneer de try normaal en zonder exceptie wordt voltooid. Het wordt niet uitgevoerd nadat een exceptieafhandelaar een fout heeft hersteld. Het wordt ook overgeslagen wanneer return, break of continue de try voortijdig verlaat. Fouten die binnen else worden opgeworpen, worden niet opgevangen door de eerdere except-clausules van die instructie, zodat werkzaamheden na succes niet per ongeluk dezelfde exceptieafhandelaars gebruiken als de bewerking waarbij een fout kan optreden.

Laat opruimen bij elke uitgang plaatsvinden

finally wordt uitgevoerd wanneer de uitvoering de instructie verlaat: na succes, na een afgehandelde exceptie en voordat een niet-afgehandelde exceptie verder wordt doorgegeven. Het wordt ook uitgevoerd voordat een op handen zijnde terugkeer wordt voltooid.

def label():
    try:
        return "from try"
    finally:
        print("finally ran")

value = label()
print(value)

Dit drukt “finally ran” af en daarna “from try”. De terugkeer wachtte terwijl het opruimen plaatsvond. Voor bestanden regelt with het sluiten al, zodat handmatig sluiten in finally meestal niet nodig is.

Zet geen instructie die het blok verlaat, zoals return, break of continue, in finally. Als je het opruimblok op die manier verlaat, kan een op handen zijnde exceptie worden weggegooid of een retourwaarde worden overschreven. Python 3.14 en later geven voor dit patroon een SyntaxWarning. Gebruik het opruimblok alleen om op te ruimen.

Volg een exceptie naar de aanroepende code
def read_scores(path):
    with open(path, encoding="utf-8") as f:
        return [int(line) for line in f]

try:
    scores = read_scores("scores.txt")
except FileNotFoundError:
    print("The score file is missing.")

Als het openen mislukt, heeft read_scores() geen exceptieafhandelaar, dus wordt FileNotFoundError doorgegeven aan de aanroep binnen de buitenste try. De aanroepende code handelt de exceptie af en drukt de melding af. Als een regel geen geheel getal is, volgt een ValueError dezelfde route, maar de exceptieafhandelaar voor een ontbrekend bestand komt daar niet mee overeen.

Kies het niveau dat zinvol kan reageren

Een leesfunctie weet mogelijk hoe ze gegevens moet ophalen, maar niet of een ontbrekend bestand moet leiden tot opnieuw proberen, een taak overslaan of gecontroleerd stoppen. Door de exceptie de aanroepende code te laten bereiken die met de gebruiker communiceert, blijft die keuze daar. Als je de exceptie te vroeg opvangt en een lege lijst teruggeeft, kan het verschil tussen een leeg bestand en een mislukte leesactie verborgen blijven.

Belangrijkste punten

  • else wordt alleen uitgevoerd nadat de inhoud van de try normaal is voltooid.
  • finally wordt uitgevoerd voordat de uitvoering het blok verlaat, ook bij een terugkeer of een niet-afgehandelde exceptie.
  • Een exceptie in else valt buiten de voorafgaande exceptieafhandelaars in die instructie.
  • Vermijd manieren om finally te verlaten die op handen zijnde fouten of retourwaarden kunnen weggooien.
  • Niet-afgehandelde excepties worden via aanroepen doorgegeven aan een overeenkomende buitenliggende exceptieafhandelaar.

4.4 Herstellen van bestands- en rijfouten

Een programma handelt een fout gecontroleerd af wanneer het beheerst en bruikbaar op een probleem reageert. Het kan opnieuw vragen, een overgeslagen rij melden of stoppen met een duidelijke melding. Kies die reactie op basis van waarvoor het resultaat wordt gebruikt.

Probeer een ontbrekend bestand opnieuw
while True:
    name = input("File name: ").strip()
    try:
        with open(name, encoding="utf-8") as f:
            text = f.read()
    except FileNotFoundError:
        print(f"No file named '{name}'. Please try again.")
    else:
        break
print(len(text.splitlines()), "lines")

Een mislukte opening slaat de toekenning over en bereikt de exceptieafhandelaar. De lus vraagt opnieuw om invoer. Een geslaagde leesactie bereikt else, verlaat de lus en laat text beschikbaar voor de eindtelling. with sluit het bestand op beide manieren waarop een eenmaal betreden blok kan worden verlaten.

Gebruik voor verschillende bestandsproblemen eerst FileNotFoundError, dan PermissionError en daarna een algemene OSError-afhandelaar als andere bestandssysteemfouten een reactie vereisen. De specifieke clausules moeten eerst komen. Ongeldige bytes decoderen is een ander probleem; een melding over een ontbrekend pad zou dat niet beschrijven.

Handel elke gegevensrij afzonderlijk af

Stel dat voor een snel verkoopoverzicht de CSV-rijen na de kopregel coffee,4, tea,two, muffin,3, cookie, en juice,5 zijn.

import csv
total = 0
skipped = 0
with open("sales.csv", newline="", encoding="utf-8") as f:
    reader = csv.reader(f)
    next(reader, None)
    for row in reader:
        try:
            if len(row) != 2:
                raise ValueError("expected two fields")
            quantity = int(row[1])
        except ValueError as err:
            skipped += 1
            print(f"sales.csv, ending line {reader.line_num}: {err}")
        else:
            total += quantity
print("Total:", total, "Skipped:", skipped)

De geldige hoeveelheden tellen op tot 12. Het woord “two” en de lege hoeveelheid worden afgewezen, dus het aantal overgeslagen rijen is 2. De rijcontrole maakt van een onverwacht aantal velden ook een gemelde gegevensfout voordat een index wordt gebruikt. Door try binnen de lus te plaatsen, kan het volgende record worden verwerkt nadat er één mislukt; als je de lus binnen één try plaatst, verlaat je de lus bij de eerste fout.

Meld locaties nauwkeurig

Voor de vijf records van één regel eindigen de ongeldige waarden op bestandsregels 3 en 5. enumerate(reader, start=2) zou hier met die regelnummers overeenkomen, maar door een regeleinde tussen aanhalingstekens kan een CSV-record meer dan één regel beslaan. reader.line_num geeft aan hoeveel fysieke regels de lezer heeft verwerkt. Door dit de eindregel te noemen, blijven meldingen nauwkeurig voor records die meerdere regels beslaan.

Bepaal of een gedeeltelijk resultaat aanvaardbaar is

Een snelle verkennende telling kan gemelde overgeslagen rijen toestaan. Een financieel totaal of een cijfertotaal kan elk record vereisen: stop en vraag om gecorrigeerde gegevens in plaats van een gedeeltelijk totaal als volledig te presenteren. Noem het bestand, de locatie en het probleem zodat het kan worden opgelost.

Na import sys schrijft sys.exit("Could not open sales.csv") de melding naar de foutuitvoer en stopt het programma met afsluitcode 1. Dit werpt SystemExit op, wat except Exception niet opvangt. Houd exceptieafhandelaars specifiek, zodat een niet-gerelateerde programmeerfout niet ten onrechte als een bestandsprobleem wordt aangeduid.

Belangrijkste punten

  • Kies opnieuw proberen, overslaan of stoppen op basis van de taak.
  • Plaats foutherstel per rij binnen de lus om na een ongeldige rij door te gaan.
  • Meld overgeslagen records en geef gedeeltelijke resultaten duidelijk aan.
  • CSV-recordnummers kunnen verschillen van fysieke regelnummers.
  • sys.exit(message) beëindigt het programma met een foutmelding en afsluitcode 1.
  • Gebruik specifieke exceptieafhandelaars zodat de melding bij het werkelijke probleem past.
5

Werp zelf excepties op

Functies hebben een duidelijke manier nodig om invoer te melden die ze niet kunnen verwerken. Een exceptie opwerpen voorkomt dat een mislukte bewerking een misleidend resultaat oplevert en laat de aanroepende code een reactie kiezen. Je kiest betekenisvolle typen en meldingen, geeft een bestaande fout door en behoudt de oorzaak wanneer je die omzet. Een kort patroon met een zelfgedefinieerde klasse geeft een programma een eigen fouttype wanneer aanroepende code het ene probleem van het andere moet kunnen onderscheiden.

5.1 Invoer afwijzen met raise

Een functie moet een signaal geven wanneer ze geen geldig resultaat kan opleveren. raise werpt op dat punt een exceptie op, zodat het ongeldige pad niet kan doorgaan alsof de bewerking is geslaagd.

Controleer vóór het rekenen
def withdraw(balance, amount):
    if amount <= 0:
        raise ValueError(f"amount must be positive, got {amount}")
    if amount > balance:
        raise ValueError(f"amount {amount} is more than the balance {balance}")
    return balance - amount

withdraw(100, 30) geeft 70 terug. withdraw(100, 150) werpt een fout op over het saldo; withdraw(100, -5) werpt een fout op over een niet-positief bedrag. Geen van beide mislukte aanroepen bereikt de aftrekking.

Een opgeworpen exceptie volgt dezelfde afhandelingsregels als een ingebouwde fout. Als een overeenkomende exceptieafhandelaar binnen de functie de exceptie opvangt, kan de uitvoering daar doorgaan. Anders verlaat de exceptie de functie en bereikt ze de aanroepende code. Als geen exceptieafhandelaar wordt gevonden, toont Python een stacktrace.

Laat de aanroepende code de reactie kiezen
balance = 100
amount = 150
try:
    balance = withdraw(balance, amount)
except ValueError as err:
    print(f"Cannot withdraw: {err}")

De functie meldt waarom ze geen geld kan opnemen. De aanroepende code besluit een melding te tonen. Omdat de functieaanroep mislukt voordat een waarde wordt teruggegeven, vervangt de toekenning het oude saldo niet door een resultaat. Andere aanroepende code zou om een lager bedrag kunnen vragen of een transactie kunnen annuleren zonder de functie te wijzigen.

Als de functie in plaats daarvan een waarschuwing afdrukt en None teruggeeft, kan de aanroepende code een ongeldige waarde meenemen naar een latere berekening. Door een exceptie op te werpen blijft de fout verbonden met de oorzaak en krijgt de aanroepende code een afzonderlijk foutpad.

Kies een betekenisvol type
ProbleemGeschikt type
Juiste soort invoer, onaanvaardbare waardeValueError
Verkeerde soort object voor de bewerkingTypeError

Een negatief numeriek bedrag heeft een onaanvaardbare waarde. Een lijst die wordt opgegeven waar een getal nodig is, heeft een ongeschikt type. Het exceptietype maakt deel uit van het gedrag van de functie: aanroepende code gebruikt het om exceptieafhandelaars te kiezen. Kies een type niet alleen omdat het bekend is.

Schrijf een bruikbare melding

Een melding moet benoemen wat werd verwacht en wat werd ontvangen. f"age must be between 0 and 130, got {age}" wijst op een oplossing. Een melding als “fout” geeft geen bruikbare details. Laat de melding over de mislukte bewerking gaan; code die met de gebruiker communiceert, kan de bredere context toevoegen.

raise ValueError("amount must be positive") maakt een exceptie met een melding. raise ValueError is ook geldig en maakt er een zonder melding. Een gewone string is geen exceptie: raise "error" werpt TypeError op omdat opgeworpen objecten moeten afstammen van BaseException.

Belangrijkste punten

  • Werp een exceptie op waar een functie niet correct kan doorgaan.
  • Gebruik ValueError voor een onaanvaardbare waarde en TypeError voor een ongeschikt type.
  • Neem de verwachte invoer en de ontvangen waarde op in een behulpzame melding.
  • Laat de aanroepende code beslissen hoe op de mislukte bewerking wordt gereageerd.

5.2 Excepties doorgeven en benoemen

Soms merkt een functie een fout op, maar kan ze die niet volledig afhandelen. Ze moet mogelijk dezelfde fout doorgeven, omzetten in een bruikbaardere fout of een specifiek programmaprobleem een eigen exceptietype geven.

Werp de huidige fout opnieuw op
def read_text(path):
    try:
        with open(path, encoding="utf-8") as f:
            return f.read()
    except FileNotFoundError:
        print(f"Missing: {path}")
        raise

De kale raise binnen de exceptieafhandelaar werpt de huidige exceptie opnieuw op. Alleen een melding afdrukken zou de exceptieafhandelaar beëindigen en de functie None laten teruggeven; opnieuw opwerpen maakt de mislukte leesactie zichtbaar voor de aanroepende code. Een kale raise heeft een actieve exceptie nodig om opnieuw op te werpen.

Zet om met behoud van de oorzaak
def read_price(row):
    try:
        text = row["price"]
    except KeyError as err:
        raise ValueError("row has no 'price' column") from err
    return float(text)

Een ontbrekende sleutel wordt een ValueError met een melding over de rij. from err legt de oorspronkelijke KeyError vast als directe oorzaak. De stacktrace toont de oorspronkelijke fout, het verband ertussen en de nieuwe fout. De aanroepende code kan het omgezette type afhandelen terwijl de onderliggende oorzaak voor het debuggen beschikbaar blijft.

Deze exceptieafhandelaar is beperkt tot het opzoeken. Een aanwezige waarde zoals "free" mislukt later bij float(text) met een eigen ValueError; die wordt niet ten onrechte als een ontbrekende kolom gemeld.

Definieer een afzonderlijk type
class InsufficientFundsError(ValueError):
    pass

Dit patroon maakt een zelfgedefinieerde exceptieklasse. De naam eindigt volgens afspraak op Error. De naam tussen haakjes is het bovenliggende type, dus deze klasse is een soort ValueError.

def withdraw(balance, amount):
    if amount > balance:
        raise InsufficientFundsError(
            f"balance {balance}, requested {amount}"
        )
    return balance - amount

try:
    withdraw(100, 150)
except InsufficientFundsError as err:
    print("Not enough money:", err)

Het programma drukt “Not enough money: balance 100, requested 150” af. Aanroepende code kan onvoldoende saldo onderscheiden van een andere ongeldige waarde. Als een ValueError-afhandelaar vóór deze specifieke exceptieafhandelaar zou staan, zou het bovenliggende type de exceptie als eerste opvangen.

Kies het bovenliggende type voor de gewenste afhandeling

Als je afleidt van ValueError, kunnen zowel een specifieke exceptieafhandelaar als een bredere afhandelaar voor waardefouten het zelfgedefinieerde type opvangen. Rechtstreeks afleiden van Exception maakt een aparte tak voor gewone fouten, zodat except ValueError de exceptie niet zou opvangen. Een zelfgedefinieerd type is handig wanneer aanroepende code een afzonderlijke reactie nodig heeft; een duidelijk ingebouwd type en een duidelijke melding zijn voldoende wanneer dat niet zo is.

Belangrijkste punten

  • Een kale raise in een exceptieafhandelaar geeft de huidige exceptie door.
  • raise NewError(...) from err legt de oorspronkelijke fout vast als directe oorzaak.
  • Een zelfgedefinieerde exceptie geeft aanroepende code een afzonderlijk probleemtype.
  • De bovenliggende klasse bepaalt welke bredere exceptieafhandelaars de zelfgedefinieerde fout kunnen opvangen.
  • Plaats een specifieke exceptieafhandelaar voor een zelfgedefinieerd type vóór de afhandelaar voor het bovenliggende type.

Bestanden en excepties in Python: voorbeelden

5 Walkthroughs

1

Zet een tekstbestand om in een gefilterd rapport

13 stappen
Lees regels, kies bestandsmodi en sla geselecteerde records op terwijl duidelijk blijft hoelang bestanden open zijn.
  1. 1
    IntroductieLees, beslis, sla op

    Een ondersteuningslogbestand bevat één gebeurtenis per regel. Je wilt een nieuw bestand met alleen de gebeurtenissen die aandacht vereisen. Die taak combineert lezen, stringcontroles en schrijven.

    Volg eerst hoe een bestand tekst levert. Bouw daarna het filter in kleine stappen, houd de invoer gescheiden van de uitvoer en laat with beide bestanden sluiten wanneer de verwerking eindigt.

  2. 2
    UitlegEen bestand levert strings

    Stel dat events.txt "INFO Ready\nERROR Queue full\n" bevat. Als je het opent, ontstaat een bestandsobject, geen kopie van de tekst.

    f.readline() geeft "INFO Ready\n" terug. Een tweede aanroep geeft "ERROR Queue full\n" terug. Een derde geeft "" terug omdat het bestand is uitgelezen. Het regeleindeteken blijft aan een teruggegeven regel vastzitten; ook numerieke tekst blijft tekst totdat die expliciet wordt omgezet.

  3. 3
    UitdagingKies een leesmethode

    Een logbestand kan veel groter zijn dan het beschikbare geheugen. Je hoeft elke regel maar één keer te bekijken. Hoe moet je het lezen en waarom?

    ---reveal---

    Doorloop het open bestand rechtstreeks met for line in f:. Dit levert één regel tegelijk zonder eerst een string of lijst van het hele bestand nodig te hebben. Een aanroep van read() of readlines() zou de resterende inhoud in het geheugen laden.

  4. 4
    VoorbeeldHoud het lezen binnen het blok
    with open("events.txt", encoding="utf-8") as f:
        first = f.readline()
    print(first.rstrip("\n"))
    

    Het lezen gebeurt terwijl het bestand open is. Als je het ingesprongen blok verlaat, sluit het bestand; de latere afdruk gebruikt de opgeslagen string. Daarom kan een bewerking op first daarna plaatsvinden, terwijl een nieuwe f.readline() dat niet kan.

  5. 5
    UitdagingVoorspel het opruimen na een fout

    Stel dat binnen dat bestandsblok int("oops") ValueError opwerpt. De omringende code heeft geen exceptieafhandelaar. Blijft het bestand open en verbergt with de fout?

    ---reveal---

    Het bestand sluit wanneer de uitvoering het betreden blok verlaat. De fout wordt nog steeds doorgegeven en levert een stacktrace op als niets haar opvangt. Automatisch opruimen beschermt de levensduur van het bestand; voor herstel zou een except-afhandelaar nodig zijn.

  6. 6
    UitlegKies wat er met de uitvoer gebeurt

    Het gefilterde rapport moet een ouder rapport vervangen, dus open een ander uitvoerpad met "w". Die modus maakt een bestaand bestand onmiddellijk leeg.

    Gebruik "a" voor een activiteitengeschiedenis die eerdere uitvoeringen bewaart. Als een bestaand rapport tegen vervanging moet worden beschermd, gebruik je "x" en handel je FileExistsError af. Om een bestand aan te maken moeten de bovenliggende mappen nog steeds bestaan.

  7. 7
    VoorbeeldSchrijf precies één regel

    Om een geselecteerde regel te schrijven, behoud je de oorspronkelijke regelafsluiting:

    dst.write(line)
    

    Als je de regel daarentegen met strip() hebt opgeschoond, voeg je de afsluiting weer toe:

    dst.write(cleaned + "\n")
    

    write() voegt geen scheidingsteken toe. print(cleaned, file=dst) is een andere manier om een regeleindeteken toe te voegen, terwijl writelines() nog steeds verwacht dat de opgegeven strings de benodigde afsluitingen bevatten.

  8. 8
    UitdagingVoorspel twee uitvoeringen

    Er is aanvankelijk geen bestand en een programma wordt tweemaal uitgevoerd. Elke uitvoering opent "runs.txt" in toevoegmodus en roept f.write("OK") aan. Welke tekst wordt opgeslagen?

    ---reveal---

    Het bestand bevat "OKOK". De toevoegmodus behoudt de eerste uitvoering, maar noch de modus noch write() voegt een regeleindeteken toe. Als je in plaats daarvan "OK\n" zou schrijven, ontstaat één regel per uitvoering. Openen met "w" zou alleen de laatste "OK" achterlaten.

  9. 9
    VoorbeeldSchoon op vóór het selecteren

    Ons logbestand gebruikt het eerste woord als niveau. Begin elke iteratie met:

    cleaned = line.strip()
    if not cleaned:
        continue
    level = cleaned.split(maxsplit=1)[0]
    

    De controle op een lege regel voorkomt dat een lege lijst met een index wordt benaderd. Door de oorspronkelijke line apart te bewaren, kan de uitvoer de oorspronkelijke witruimte behouden. Alleen de opgeschoonde kopie wordt gebruikt om het niveau te bepalen.

  10. 10
    UitdagingControleer het juiste deel

    Het logbestand bevat “INFO ERROR counter reset” en “ERROR Queue full”. Welke niveaucontrole slaat alleen het tweede record op?

    ---reveal---

    Controleer level == "ERROR" nadat je het eerste woord hebt opgehaald. Overal naar "ERROR" zoeken zou ook het informatieve record opslaan omdat het woord in het bericht voorkomt. De indeling vertelt je waar je de categorie vindt die je selecteert.

  11. 11
    VoorbeeldStel het filter samen
    count = 0
    with open("events.txt", encoding="utf-8") as src, open("urgent.txt", "w", encoding="utf-8") as dst:
        for line in src:
            cleaned = line.strip()
            if not cleaned:
                continue
            if cleaned.split(maxsplit=1)[0] == "ERROR":
                dst.write(line)
                count += 1
    print(count, "saved")
    

    De teller verandert alleen wanneer een record wordt geschreven. Beide bestanden sluiten voordat de telling wordt afgedrukt.

  12. 12
    UitdagingOnderzoek een verloren bron

    Iemand verandert de uitvoernaam in "events.txt" en behoudt "w". Waarom loopt het filter nu het risico niets op te slaan, hoewel de bron eerst werd geopend?

    ---reveal---

    De tweede opening maakt hetzelfde onderliggende bestand leeg voordat de lus het leest. Het eerste bestandsobject heeft geen aparte kopie van de oude tekst opgeslagen. Herstel een ander uitvoerpad zodat de omzetting haar invoer niet bij het openen kan wissen.

  13. 13
    SamenvattingVolg een bestandstaak vóór uitvoering

    Volg bij een bestandsomzetting vier beslissingen: waar de invoer vandaan komt, hoeveel tekst tegelijk wordt gelezen, wat een record selecteert en wat het openen van de uitvoer met bestaande gegevens doet.

    Controleer daarna de grenzen van het blok. Bestandsbewerkingen hebben open bestandsobjecten nodig; opgeslagen strings, lijsten en totalen kunnen worden gebruikt nadat die zijn gesloten.

2

Vind projectgegevens vanuit elke startmap

9 stappen
Volg relatieve paden, stel paden samen ten opzichte van het script en bereid mappen voor met pathlib.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieVind de beginmap
  2. 2
    VoorbeeldVolg een start
  3. 3
    UitdagingVerander de startmap
  4. 4
    TipControleer voordat je het pad verandert
  5. 5
    VoorbeeldStel samen vanuit het script
  6. 6
    UitlegBereid een doel voor
  7. 7
    UitdagingBekijk een naam en vind overeenkomsten
  8. 8
    UitdagingControleer een voorgestelde oplossing
  9. 9
    SamenvattingMaak onderscheid tussen locatie en beschikbaarheid
3

Lees een tabel en schrijf een rapport met benoemde kolommen

13 stappen
Lees CSV met velden tussen aanhalingstekens, converteer numerieke velden en exporteer geselecteerde kolommen in een bepaalde volgorde.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieBehoud de structuur van de tabel
  2. 2
    VoorbeeldLees één record met aanhalingstekens
  3. 3
    VoorbeeldOpen en converteer
  4. 4
    UitdagingHerken een korte rij
  5. 5
    VoorbeeldSchrijf waarden als velden
  6. 6
    UitdagingHoud één veld bij elkaar
  7. 7
    UitlegGebruik de kopregel als sleutels
  8. 8
    VoorbeeldFilter op voorraad
  9. 9
    UitdagingMaak onderscheid tussen ontbrekend en leeg
  10. 10
    VoorbeeldExporteer geselecteerde kolommen
  11. 11
    UitdagingVoeg een latere reeks toe
  12. 12
    TipKies passende scheidingstekens en tekencoderingen
  13. 13
    SamenvattingControleer zowel structuur als betekenis
4

Volg een fout van een ongeldige rij naar een bruikbare reactie

15 stappen
Lees een stacktrace, kies exceptieafhandelaars en maak onderscheid tussen een bestand opnieuw proberen en herstel binnen een rijenlus.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieKies waarvan herstel mogelijk is
  2. 2
    VoorbeeldBegin met het exceptietype
  3. 3
    UitdagingHerken een andere fout
  4. 4
    VoorbeeldVang alleen de verwachte conversiefout op
  5. 5
    UitdagingZet verwante exceptieafhandelaars in volgorde
  6. 6
    UitlegGeef succes en opruimen afzonderlijke taken
  7. 7
    UitdagingVolg een fout zonder overeenkomst
  8. 8
    VerbandLaat de aanroepende code beslissen
  9. 9
    VoorbeeldHoud herstel binnen de recordlus
  10. 10
    VoorbeeldVolg drie records
  11. 11
    UitdagingVerander de grens van de lus
  12. 12
    TipBenoem de locatie correct
  13. 13
    UitdagingKies een volledig resultaat
  14. 14
    VoorbeeldStop met een foutstatus
  15. 15
    SamenvattingPlaats elke reactie op het juiste niveau
5

Ontwerp het foutgedrag van een functie

10 stappen
Valideer een aanvraag, werp bruikbare fouten op en behoud onderscheid en oorzaken voor de aanroepende code.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieGeef fouten een duidelijk pad
  2. 2
    VoorbeeldWijs ongeldige aanvragen af
  3. 3
    UitdagingVolg een mislukte toekenning
  4. 4
    UitlegKies het type dat bij het probleem past
  5. 5
    VoorbeeldGeef een specifiek tekort een naam
  6. 6
    UitdagingHoud de specifieke reactie bereikbaar
  7. 7
    VoorbeeldReageer en geef de fout door
  8. 8
    VoorbeeldZet een onderliggende fout om
  9. 9
    UitdagingKies de juiste relatie
  10. 10
    SamenvattingHoud de fout betekenisvol voor de aanroepende code

Bestanden en excepties in Python: oefenvragen

50 Oefenvragen in 5 sets

Set 1: Bestanden en herstelpaden doorlopen10 Oefenvragen

Vraag 1 van 10

Een nieuw bestand wordt beschreven met f.writelines(["red", "blue\n"]) en daarna nogmaals geopend in toevoegmodus om "green\n" te schrijven. Welke tekst bevat het?
  1. "redblue\ngreen\n"
  2. "red\nblue\ngreen\n"
  3. "green\n"
  4. "redbluegreen\n"
Toon antwoordVerberg antwoord
Antwoord: A
writelines() voegt geen scheidingstekens toe, dus schrijft de eerste bewerking "redblue\n". De toevoegmodus behoudt daarna die tekst en voegt "green\n" toe. Het ontbrekende regeleindeteken na “red” wordt niet door de methodenaam aangevuld en de toevoegmodus vervangt eerdere uitvoer niet.

Vraag 2 van 10

Een bestand bevat alleen “bad”. Wat wordt afgedrukt?

try:
    with open("one.txt", encoding="utf-8") as f:
        value = int(f.readline())
except ValueError:
    print(f.closed)
  1. False
  2. True
  3. Een NameError-stacktrace.
  4. Een FileNotFoundError-stacktrace.
Toon antwoordVerberg antwoord
Antwoord: B
De conversie werpt een exceptie op binnen een betreden with-blok, dus sluit het verlaten van dat blok het bestand voordat de buitenste exceptieafhandelaar wordt uitgevoerd. De afgedrukte waarde is True. De exceptieafhandelaar zorgt voor herstel; with zorgt voor opruimen en hervat de mislukte conversie niet.

Vraag 3 van 10

De mappen results en results/daily ontbreken. Wat moet worden uitgevoerd voordat je schrijft met Path("results/daily/run.txt").write_text("ok", encoding="utf-8")?
  1. Path("results/daily").mkdir(exist_ok=True)
  2. Path("results/daily/run.txt").mkdir(parents=True)
  3. Path("results/daily").exists()
  4. Path("results/daily").mkdir(parents=True, exist_ok=True)
Toon antwoordVerberg antwoord
Antwoord: D
Maak de bovenliggende map aan met parents=True zodat ook de ontbrekende bovenliggende map wordt aangemaakt. exist_ok=True staat ook latere uitvoeringen toe wanneer de map al bestaat. Zonder parents=True mislukt het aanmaken van daily omdat results ontbreekt; schrijven maakt geen van beide mappen aan.

Vraag 4 van 10

Een programma dat tekst toevoegt, schrijft alleen een kopregel wanneer not p.exists(). Het pad bestaat, maar heeft nul bytes. Welke voorwaarde geeft ook dit bestand de benodigde kopregel?
  1. p.exists() and p.stat().st_size > 0
  2. not p.exists() and p.stat().st_size == 0
  3. not p.exists() or p.stat().st_size == 0
  4. p.exists()
Toon antwoordVerberg antwoord
Antwoord: C
Een kopregel is nodig voor een ontbrekend bestand of een bestaand leeg bestand, dus verbind je die voorwaarden met or. De groottecontrole vangt het geval van nul bytes op dat een controle op bestaan alleen mist. Met and zou een bestaand leeg bestand worden gemist en zou mogelijk een ontbrekend pad worden onderzocht.

Vraag 5 van 10

Een standaard ingestelde DictReader heeft de kopregel name,first,second en leest Inez,5. Welke waarde wordt opgeslagen onder "second" en wat gebeurt er wanneer die aan int() wordt doorgegeven?
  1. None; werpt TypeError op.
  2. ""; werpt ValueError op.
  3. "5"; geeft 5 terug.
  4. Geen sleutel; werpt KeyError op.
Toon antwoordVerberg antwoord
Antwoord: A
Een ontbrekend veld wordt standaard gevuld met None, dus bestaat de sleutel uit de kopregel, maar werpt int(None) TypeError op. Een aanwezig leeg veld zou "" bevatten en ValueError opwerpen. Een kopregel definieert de sleutel ook wanneer dit record te weinig waarden heeft.

Vraag 6 van 10

Welke exceptie werpt het opzoeken in de dictionary {"east": 4}["west"] op?
  1. IndexError
  2. ValueError
  3. KeyError
  4. NameError
Toon antwoordVerberg antwoord
Antwoord: C
De dictionary heeft geen sleutel met de naam "west", dus werpt het opzoeken KeyError op. IndexError betreft een ongeldige positie in een sequentie, zoals een lijstindex. De dictionary en de string zijn geldige objecten; het is de gevraagde sleutel die ontbreekt.

Vraag 7 van 10

Wat ontvangt de aanroepende code en wat wordt eerst afgedrukt?

def choose():
    try:
        return 11
    finally:
        print("leaving")
x = choose()
  1. Ontvangt None; eerst wordt “leaving” afgedrukt.
  2. Ontvangt 11; er wordt niets afgedrukt.
  3. Ontvangt “leaving”; eerst wordt 11 afgedrukt.
  4. Ontvangt 11; eerst wordt “leaving” afgedrukt.
Toon antwoordVerberg antwoord
Antwoord: D
De retourwaarde 11 wordt voorbereid, waarna finally “leaving” afdrukt voordat de functie haar terugkeer voltooit. Afdrukken tijdens het opruimen vervangt die wachtende retourwaarde niet. Een return binnen finally zou dit gedrag veranderen, maar dit blok bevat alleen print().

Vraag 8 van 10

Een CSV-samenvatting moet rijen met ongeldige numerieke gegevens melden en doorgaan naar latere records. Waar moet de try/except ValueError voor de conversie staan?
  1. Rond de hele lus, buiten de inhoud ervan.
  2. Binnen de lus, rond elke rijconversie.
  3. Na de lus, rond de laatste afdrukinstructie.
  4. Alleen rond de eerste aanroep van open().
Toon antwoordVerberg antwoord
Antwoord: B
Een binnenste exceptieafhandelaar behandelt één rij en geeft de uitvoering terug aan de lus voor het volgende record. Een exceptieafhandelaar buiten de hele lus wordt uitgevoerd nadat de exceptie die lus al heeft verlaten, zodat latere rijen niet worden bezocht. Openen en de laatste afdruk beschermen de conversie tijdens de iteratie niet.

Vraag 9 van 10

Gegeven class LimitError(ValueError): pass wordt een LimitError opgeworpen. Wat gebeurt er als except ValueError: vóór except LimitError: staat?
  1. Geen van beide clausules komt overeen met het zelfgedefinieerde type.
  2. Alleen de ValueError-afhandelaar wordt uitgevoerd.
  3. Beide exceptieafhandelaars worden in de geschreven volgorde uitgevoerd.
  4. Alleen de LimitError-afhandelaar wordt uitgevoerd.
Toon antwoordVerberg antwoord
Antwoord: B
LimitError erft van ValueError, dus komt de exceptieafhandelaar voor het bovenliggende type als eerste overeen en wordt alleen die uitgevoerd. Zelfgedefinieerde typen volgen dezelfde regel van de eerste overeenkomst als ingebouwde typen. Zet de zelfgedefinieerde exceptieafhandelaar eerst wanneer zijn reactie moet verschillen van die op andere waardefouten.

Vraag 10 van 10

Na het verwijderen van witruimte aan de randen en het overslaan van lege regels stelt een verwerker parts = line.split(maxsplit=2) in. Records moeten een datum, niveau en bericht hebben, maar sommige bevatten alleen een datum. Welke controle moet voorafgaan aan parts[1] en parts[2]?
  1. len(parts) == 3
  2. line.endswith("\n")
  3. len(line) > 3
  4. " " in parts[0]
Toon antwoordVerberg antwoord
Antwoord: A
Voor het opzoeken zijn drie velden nodig en maxsplit=2 levert er maximaal drie op, dus controleert len(parts) == 3 de vereiste indeling. Lege regels overslaan beschermt niet tegen een niet-leeg record met één veld. Ook het aantal tekens stelt het aantal velden niet vast.
Set 2: Bestanden lezen en kleine programma’s volgen10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een bestand bevat "oak\npine". Wat geeft f.readline() terug direct nadat het bestand is geopend om te lezen?
  1. "oak"
  2. ["oak\n", "pine"]
  3. "oak\n"
  4. "oak\npine"
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Het blok wordt normaal voltooid. Wat wordt afgedrukt?

with open("memo.txt", encoding="utf-8") as f:
    text = f.read()
print(f.closed)
  1. False
  2. True
  3. None
  4. text
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een programma moet een melding over een uitvoering aan een logbestand toevoegen en alle eerdere meldingen behouden. Welke tekstbestandsmodus moet het gebruiken?
  1. "a"
  2. "w"
  3. "r"
  4. "x"
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een terminal werkt in /work/lab. Hij voert python tools/count.py uit, dat "inputs/list.txt" opent. Welke absolute locatie vraagt dat relatieve pad op?
  1. /work/lab/tools/inputs/list.txt
  2. /work/inputs/list.txt
  3. /inputs/list.txt
  4. /work/lab/inputs/list.txt
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Wat is voor p = Path("exports/week/report.csv") de waarde van p.stem?
  1. ".csv"
  2. "report"
  3. "report.csv"
  4. "exports/week"
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Welke lijst wordt met de standaardinstellingen van csv.reader gelezen uit het record "River, West",6,8?
  1. ['River, West', '6', '8']
  2. ['River, West', 6, 8]
  3. ['\"River', ' West\"', '6', '8']
  4. ['River', 'West', '6', '8']
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Welke rij levert writer.writerow("Leo") op met de standaardkomma als scheidingsteken?
  1. Leo
  2. "Leo"
  3. L,e,o
  4. L e o
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een hoeveelheidsveld in een CSV-bestand bevat de string "many". Welke exceptie werpt int(row["quantity"]) op?
  1. TypeError
  2. KeyError
  3. IndexError
  4. ValueError
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Wat wordt afgedrukt?

def read_count(text):
    return 12 / int(text)
try:
    result = read_count("0")
    print("read")
except ValueError:
    print("bad text")
except ZeroDivisionError:
    print("zero")
print("end")
  1. “read”, daarna “end”
  2. “bad text”, daarna “end”
  3. “zero”, daarna “end”
  4. “zero”, daarna “read”
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een functie accepteert een geheel aantal pagina’s, maar kan een aantal onder 1 niet verwerken. Welke exceptie en melding zijn geschikt voor invoer -2?
  1. TypeError("pages must be positive, got -2")
  2. ValueError("pages must be positive, got -2")
  3. IndexError("pages must be positive, got -2")
  4. NameError("pages must be positive, got -2")
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 3: Methoden kiezen en verwachte fouten afhandelen10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een logbestand heeft de regels "09:10 INFO ERROR count reset" en "09:12 ERROR Network down". Het niveau is het tweede veld, gescheiden door witruimte. Welke voorwaarde selecteert alleen records met het foutniveau?
  1. "ERROR" in line
  2. line.startswith("ERROR")
  3. line.split()[2] == "ERROR"
  4. line.split()[1] == "ERROR"
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een bestand bevat "12\n15\n". Welk paar ontstaat door first = f.read() gevolgd door second = f.read() op één zojuist geopende lezer?
  1. first == "12\n15\n", second == ""
  2. first == "12\n", second == "15\n"
  3. first == "12\n15\n", second == first
  4. first == [12, 15], second == []
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Waarom kan de Pythonstringliteral "C:\new\tasks.txt" in Windows het bedoelde bestand mogelijk niet aanduiden?
  1. De stationsnaam maakt dit een relatief pad op een station.
  2. Backslashes werken alleen in strings met relatieve paden.
  3. De backslashes beginnen escapesequenties voor een regeleinde en een tab.
  4. Een absoluut pad moet met een schuine streep beginnen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een bestand begint met city,visitors en Mesa,24. Na reader = csv.DictReader(f) roept het programma eenmaal next(reader) aan en begint daarna een lus. Waarom ontbreekt Mesa in die lus?
  1. De lezer behandelt numerieke waarden als veldnamen.
  2. De aanroep heeft het eerste gegevensrecord ingelezen.
  3. De lezer kan geen kopregel met kleine letters gebruiken.
  4. De lus slaat records over zonder namen tussen aanhalingstekens.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

De eerste regel is label;count, maar de standaard-CSV-lezer geeft ["label;count"] terug. Welke instelling van de lezer past bij dit bestand?
  1. skipinitialspace=True
  2. delimiter=","
  3. quoting=csv.QUOTE_ALL
  4. delimiter=";"
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Wat wordt afgedrukt?

try:
    value = 18 / int("0")
except ZeroDivisionError:
    print("zero")
else:
    print("success")
finally:
    print("closed")
  1. “success”, daarna “closed”
  2. “zero”, daarna “closed”
  3. “zero”, daarna “success”
  4. “closed”, daarna “zero”
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een volledig totaal van subsidiebetalingen is vereist. Een CSV-bestand bevat één ongeldig bedrag tussen 200 records. Waarom is het een slechte herstelkeuze om dat over te slaan en de rest als het volledige totaal te tonen?
  1. Het totaal laat een vereiste betaling weg zonder dat te melden.
  2. Een conversiefout verhindert dat het bestand opnieuw wordt geopend.
  3. Overslaan verandert alle resterende betalingsbedragen.
  4. Een CSV-bestand kan geen geldige en ongeldige rijen bevatten.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

In een try treedt een FileNotFoundError op. De eerste exceptieafhandelaar is except OSError: print("file problem") en de tweede is except FileNotFoundError: print("missing"). Wat wordt afgedrukt?
  1. “missing”
  2. “file problem”, daarna “missing”
  3. “file problem”
  4. Geen exceptieafhandelaar komt overeen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Welke instructie geeft binnen een except ValueError:-blok dezelfde actieve exceptie door aan de aanroepende code?
  1. return
  2. raise
  3. continue
  4. pass
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Wat wordt afgedrukt?

def reserve(n):
    if n <= 0:
        raise ValueError("positive count required")
    return n * 2
result = 7
try:
    result = reserve(0)
except ValueError:
    print(result)
  1. 7
  2. 0
  3. None
  4. 14
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 4: Onvolledige gegevens en misleidende exceptieafhandelaars onderzoeken10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Wat geeft f.readline() terug aan het einde van een bestand?
  1. None
  2. "\n"
  3. []
  4. ""
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

data.txt bevat drie records. Een programma opent het met "r", opent daarna hetzelfde pad met "w" en begint pas dan te lezen via het eerste bestandsobject. Waarom loop je hierdoor het risico de invoer te verliezen?
  1. De leesmodus verwijdert het laatste regeleindeteken vóór het schrijven.
  2. Het eerste bestandsobject wordt automatisch een object om toe te voegen.
  3. Het openen om te schrijven maakt het bestand leeg voordat het lezen begint.
  4. Het schrijfobject kopieert elke regel voordat het die vervangt.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

p.exists() geeft True terug, maar het bestand wordt verwijderd vóór open(p, encoding="utf-8"). Wat heeft een robuust programma bij die opening nog steeds nodig?
  1. Een exceptieafhandelaar voor een ontbrekend bestand met een bruikbare reactie.
  2. Een tweede controle op bestaan die toegang garandeert.
  3. De schrijfmodus om de verwachte invoer leeg opnieuw aan te maken.
  4. Een bewerking die de ontbrekende bestandsnaam verwijdert.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een script moet data/menu.txt naast zijn eigen locatie lezen, ongeacht de startmap. Welke expressie stelt dat pad in het script samen?
  1. Path.cwd() / "data" / "menu.txt"
  2. Path(__file__).resolve().parent / "data" / "menu.txt"
  3. Path(__file__) / "data" / "menu.txt"
  4. Path("data") / "menu.txt"
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een UTF-8-CSV-bestand begint met een bytevolgordemarkering. Met encoding="utf-8" is de eerste sleutel uit de kopregel "\ufeffcode". Welke wijziging bij het openen verwijdert de markering met behoud van UTF-8-tekst?
  1. Gebruik encoding="utf-8-sig" voor het bestand.
  2. Gebruik newline="\n" in plaats van newline="".
  3. Gebruik delimiter=";" in plaats van een komma.
  4. Gebruik skipinitialspace=True voor alle velden.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een rij is {"title": "Map", "stock": "4", "cost": "3.50"}. Een standaard ingestelde DictWriter heeft fieldnames=["title", "stock"]. Wat gebeurt er wanneer die de hele rij ongewijzigd schrijft?
  1. Hij schrijft twee velden en laat cost weg.
  2. Hij voegt cost automatisch toe aan de kopregel.
  3. Hij werpt ValueError op voor de extra sleutel.
  4. Hij schrijft cost als derde naamloos veld.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een invoerlus vangt ValueError van int(text) op. Die exceptieafhandelaar drukt missing_name af, dat nooit is gedefinieerd. Wat gebeurt er met de nieuwe NameError?
  1. Dezelfde except ValueError probeert de fout automatisch opnieuw.
  2. De fout verandert in de oorspronkelijke conversiefout.
  3. De exceptieafhandelaar onderdrukt de fout en eindigt normaal.
  4. De fout wordt doorgegeven tenzij een buitenliggende exceptieafhandelaar haar opvangt.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Na een kopregel begint een CSV-record met "North op fysieke regel 2 en eindigt het met Hall",7 op regel 3. Welke locatie geeft reader.line_num na het lezen ervan?
  1. 1
  2. 3
  3. 2
  4. 7
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een hulpfunctie drukt “bad size” af en geeft None terug bij een negatieve grootte. De aanroepende code vermenigvuldigt het resultaat onmiddellijk met 4. Waarom zou ValueError opwerpen tijdens de validatie dit foutpad verbeteren?
  1. Het geeft een numerieke standaardwaarde terug voor later rekenwerk.
  2. Het garandeert dat de aanroepende code de aanvraag opnieuw probeert.
  3. Het signaleert de ongeldige grootte voordat later rekenwerk mislukt.
  4. Het meldt een typeconversiefout voordat de validatie begint.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Na het opvangen van een KeyError als err voert een exceptieafhandelaar raise ValueError("missing unit column") from err uit. Wat ontvangt de aanroepende code en welke oorzaak blijft behouden?
  1. Een KeyError veroorzaakt door de ValueError.
  2. Een ValueError veroorzaakt door de KeyError.
  3. Een ValueError zonder eerdere oorzaak.
  4. Een normale terugkeer met beide meldingsteksten.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 5: Bestandsverwerking combineren met betrouwbaar foutgedrag10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een programma betreedt with open("source.txt", encoding="utf-8") as src, open("new.txt", "x", encoding="utf-8") as dst:. De bron wordt geopend, maar new.txt bestaat al. Wat gebeurt er met src en de inhoud van het blok?
  1. src sluit; FileExistsError verhindert uitvoering van het blok.
  2. src blijft open; het blok draait zonder doelbestand.
  3. src sluit; het blok voegt toe aan het doelbestand.
  4. src blijft open; het blok vervangt het doelbestand.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een logbestand bevat "10:00 INFO ERROR resolved", "10:01 ERROR Disk slow" en "10:02 ERROR Disk full". Het tweede veld is het niveau. Hoeveel records worden opgeslagen na filteren op het foutniveau?
  1. 1
  2. 0
  3. 3
  4. 2
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een proces start in /srv/course, voert tools/read.py uit en opent "../shared/items.txt". Welk pad vraagt het op?
  1. /srv/course/shared/items.txt
  2. /srv/shared/items.txt
  3. /srv/course/tools/shared/items.txt
  4. /shared/items.txt
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een standaard ingestelde CSV-schrijver ontvangt ["Vale, East", None, 3]. Welk record ontstaat, zonder de laatste regelafsluiting mee te tellen?
  1. Vale, East,None,3
  2. "Vale, East",,3
  3. "Vale, East",None,3
  4. Vale,East,,3
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een script deelt 30 door het vast in de code opgenomen getal 5 terwijl het bedoelde aantal 6 is. Het drukt 6.0 af zonder exceptie. Wat voor probleem is dit?
  1. Een syntaxisfout veroorzaakt door de deler.
  2. Een TypeError bij numerieke deling.
  3. Een logische fout in het gekozen aantal.
  4. Een ZeroDivisionError in het totaal.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Wat wordt afgedrukt voordat de fout wordt doorgegeven?

try:
    n = int("2")
except ValueError:
    print("bad input")
else:
    print("ready")
    result = 9 / 0
finally:
    print("cleanup")
  1. “bad input”, daarna “cleanup”
  2. Alleen “ready”
  3. Alleen “cleanup”
  4. “ready”, daarna “cleanup”
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een verwerker moet elke string accepteren die int() accepteert, inclusief spaties aan het begin en een teken voor het getal. Waarom probeer je int(text) in try in plaats van eerst text.isdigit() te vereisen?
  1. De bewerkingen accepteren verschillende verzamelingen strings.
  2. isdigit() zet strings met een teken om in gehele getallen.
  3. int() accepteert elke string die een cijfer bevat.
  4. Een try-instructie verwijdert spaties uit de invoer.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een hulpprogramma voert sys.exit("Required file unavailable") uit binnen code die onder except Exception: valt. Wat gebeurt er?
  1. De exceptieafhandelaar ontvangt ValueError en probeert opnieuw.
  2. Het hulpprogramma geeft de melding terug als normale waarde.
  3. SystemExit passeert de exceptieafhandelaar; de afsluitcode is 1.
  4. De exceptieafhandelaar ontvangt SystemExit en gaat door.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een CSV-samenvatting initialiseert total = 0 en skipped = 0. Een binnenste exceptieafhandelaar slaat een rij over als die minder dan twee velden heeft of als int(row[1]) mislukt. Hij telt geldig geconverteerde waarden bij het totaal op. Welk eindpaar wordt gemeld voor de rijen ["lamp", "8"], ["desk"], ["chair", "bad"] en ["shelf", "5"]?
  1. total = 8, skipped = 1
  2. total = 13, skipped = 2
  3. total = 13, skipped = 1
  4. total = 8, skipped = 2
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Gegeven class ImportDataError(Exception): pass vangt aanroepende code alleen ValueError op. Wat gebeurt er wanneer de hulpfunctie ImportDataError opwerpt?
  1. De exceptie wordt doorgegeven omdat de klasse buiten de tak van ValueError valt.
  2. De exceptie wordt opgevangen omdat ValueError ook van Exception afstamt.
  3. De exceptie wordt opgevangen als de melding een onaanvaardbare waarde beschrijft.
  4. De exceptie wordt ValueError wanneer de hulpfunctie haar doorgeeft.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Kom je niet uit je eigen opgave? Huiswerkhulp

Kernbegrippen

83 Kernbegrippen, elk met een definitie

A

aanroepende code
Aanroepende code is de code die een functie aanroept en het teruggegeven resultaat ontvangt of een exceptie die de functie niet afhandelt.
De aanroepende code kan een ongeldige opname opvangen en om een lager bedrag vragen zonder de hulpfunctie voor de berekening te wijzigen.
absoluut pad
Een absoluut pad geeft een locatie aan vanaf een wortel van het bestandssysteem, zoals / op Unixachtige systemen of de wortel van een station in Windows.
De locatie /Users/maya/data/notes.txt is niet afhankelijk van de huidige werkmap.
accumulator
Een accumulator is een variabele die tijdens een lus wordt bijgewerkt om uit de verwerkte records een resultaat op te bouwen, zoals een totaal of telling.
De variabele errors begint bij 0 en wordt met 1 verhoogd telkens wanneer de lus een record met het foutniveau vindt.
afkappen
Afkappen maakt de inhoud van een bestaand bestand leeg wanneer het in schrijfmodus wordt geopend, voordat het programma nieuwe tekst aanlevert.
Een invoerbestand openen met "w" vernietigt de oude records, ook als het programma nooit een schrijfaanroep bereikt.
afsluitcode
Een afsluitcode is een numeriek resultaat dat naar het besturingssysteem wordt gestuurd wanneer een programma eindigt, zodat een ander programma een fout kan herkennen.
sys.exit("Missing input") drukt de melding af naar de foutuitvoer en eindigt met afsluitcode 1.
AttributeError
Een AttributeError signaleert een verzoek om een attribuut of methode dat of die een object niet biedt.
De aanroep "hi".push("!") werpt AttributeError op omdat een Pythonstring geen methode met de naam push heeft.

B

bestandsextensie
Een bestandsextensie is de laatste extensie van een bestandsnaam, inclusief de voorafgaande punt, en is beschikbaar via de property suffix van een pad.
De bestandsextensie van Path("data/sales.csv") is ".csv", die een programma kan gebruiken bij het selecteren van tabelbestanden.
bestandsmodus
Een bestandsmodus is een argument van open() dat de toegestane toegang bepaalt en aangeeft hoe bij het openen met bestaande inhoud op het pad wordt omgegaan.
Een activiteitenlogbestand gebruikt "a" om eerdere meldingen te bewaren, terwijl een nieuw rapport "w" kan gebruiken om ze te vervangen.
bestandsnaam zonder laatste extensie
De bestandsnaam zonder laatste extensie is het laatste onderdeel van een pad waarvan de laatste extensie is verwijderd, handig om verwante uitvoernamen van een bestandsnaam af te leiden.
Voor Path("logs/run.txt") is de bestandsnaam zonder laatste extensie "run", terwijl de volledige laatste naam "run.txt" is.
bestandsobject
Een bestandsobject is het object dat open() teruggeeft en dat een programma methoden biedt om een geopend bestand te lezen of te schrijven.
Binnen with open("notes.txt", encoding="utf-8") as f: verwijst de naam f naar het bestandsobject.
bestandspositie
Een bestandspositie geeft aan waar de volgende leesbewerking begint en gaat vooruit terwijl het programma tekst uit het bestand leest.
Nadat f.read() de resterende inhoud heeft gelezen, geeft een tweede leesactie een lege string terug.
binaire modus
De binaire modus leest en schrijft ruwe bytes in plaats van gedecodeerde strings en accepteert daarom geen argument voor een tekencodering.
Een modus zoals "rb" duidt invoer van bytes aan, terwijl tekstinvoer een modus zoals "r" gebruikt.
bovenliggende exceptieklasse
Een bovenliggende exceptieklasse is de klasse waarvan een andere foutklasse afstamt, waardoor exceptieafhandelaars voor die klasse overeenkomen met instanties van het onderliggende type.
Door LimitError van ValueError af te leiden, kan een bestaande ValueError-afhandelaar die ook opvangen.
bovenliggende map
Een bovenliggende map is de map waarin een bestand of map zich bevindt; de property parent van een pad selecteert die omvattende locatie.
Voor Path("reports/2026/sales.csv") is de bovenliggende map het pad reports/2026.
buffer
Een buffer is een tijdelijk gedeelte van het geheugen dat gegevens tijdens invoer of uitvoer vasthoudt, zoals geschreven tekst die wacht om een bestand te bereiken.
Het sluiten van een uitvoerbestand schrijft de gebufferde tekst weg, zodat de wachtende schrijfbewerkingen aan het bestand worden doorgegeven.
bytevolgordemarkering
Een bytevolgordemarkering is een markering voor de tekencodering aan het begin die sommige UTF-8-exportbestanden bevatten en die in het eerste veld kan verschijnen als ze behouden blijft.
Lezen met encoding="utf-8-sig" verwijdert de markering aan het begin zodat de eerste kolomnaam overeenkomt met de bedoelde naam.

C

contextbeheerder
Een contextbeheerder is een object dat gedrag bij het betreden en verlaten van een with-blok regelt, zoals toegang openen en opruimen.
Een bestandsobject werkt als contextbeheerder zodat een programma erop kan vertrouwen dat het bestand automatisch sluit bij het verlaten van het blok.
CSV
CSV is een tekstformaat voor tabelrecords die bestaan uit gescheiden velden, met regels voor aanhalingstekens waardoor scheidingstekens en regeleinden in waarden mogelijk zijn.
Het record "Lopez, Maria",10,8 heeft drie velden omdat de eerste komma binnen een naam tussen aanhalingstekens staat.
CSV-schrijver
Een CSV-schrijver zet sequenties van veldwaarden om in records, waarbij waarden in tekst worden omgezet en de gekozen regels voor aanhalingstekens worden toegepast.
Een schrijver plaatst een productnaam met een komma automatisch tussen aanhalingstekens wanneer het programma die als één veld opgeeft.

D

DictReader
Een DictReader leest CSV-gegevensrecords als dictionary’s waarvan de sleutels uit de kopregel komen, terwijl veldwaarden standaard strings blijven.
Na de kopregel name,score kan een rij met row["score"] worden benaderd, ook als de kolommen een andere volgorde krijgen.
DictWriter
Een DictWriter schrijft dictionary’s als CSV-rijen en gebruikt een opgegeven sequentie van veldnamen om de kolommen en hun volgorde te kiezen.
Een schrijver met fieldnames=["product", "stock"] exporteert die kolommen wanneer passende dictionary’s worden doorgegeven.
doorgifte van excepties
Doorgifte van excepties voert een niet-afgehandelde exceptie naar buiten door de aanroepende functies totdat een overeenkomende exceptieafhandelaar wordt gevonden of de uitvoering eindigt.
Een hulpfunctie die een bestand leest, kan FileNotFoundError laten doorgaan naar de aanroepende code die weet of om een ander pad moet worden gevraagd.

E

else-clausule
Een else-clausule bij een try-instructie wordt uitgevoerd wanneer de beschermde inhoud normaal wordt voltooid, zonder exceptie of voortijdig verlaten van het blok.
Een geslaagde conversie kan leiden tot uitvoer in else, terwijl een fout die bij die uitvoer wordt opgeworpen niet door de eerdere exceptieafhandelaars wordt opgevangen.
exceptie
Een exceptie is een object dat een fout signaleert en de normale uitvoering onderbreekt terwijl Python naar een overeenkomende exceptieafhandelaar zoekt.
Een mislukte conversie met int("many") werpt een exceptie op voordat de volgende instructie in dat blok wordt uitgevoerd.
exceptieafhandelaar
Een exceptieafhandelaar is een except-blok dat op basis van een overeenkomend exceptietype wordt gekozen om beheerst op een mislukte bewerking te reageren.
Een ValueError-afhandelaar kan uitleggen dat een hoeveelheid een geheel getal moet zijn en een omvattende lus opnieuw laten vragen.
exceptiehiërarchie
Een exceptiehiërarchie is de structuur van bovenliggende en onderliggende foutklassen die bepaalt hoe exceptieafhandelaars voor bredere typen overeenkomen.
Een exceptieafhandelaar voor OSError komt ook overeen met FileNotFoundError, terwijl een ValueError-afhandelaar niet overeenkomt met KeyError.
excepties koppelen
Excepties koppelen legt via raise ... from err een eerdere fout vast als directe oorzaak van een nieuwe exceptie.
Een ontbrekende prijssleutel kan een duidelijkere rijfout worden, terwijl de stacktrace de oorspronkelijke KeyError als oorzaak bewaart.
exclusief aanmaken
Exclusief aanmaken maakt alleen een nieuw bestand aan wanneer het pad ongebruikt is en werpt FileExistsError op als daar al een bestand bestaat.
Modus "x" voorkomt dat een nieuw gegenereerd rapport ongemerkt een rapport op hetzelfde pad vervangt.
extra veld
Een extra veld is een recordwaarde boven het aantal velden in de kopregel; een standaard ingestelde DictReader verzamelt zulke waarden onder de sleutel None.
Bij twee namen in de kopregel behoudt een rij met drie waarden de benoemde waarden en slaat de extra waarde op in een lijst.

F

fieldnames
De sequentie fieldnames geeft de kolomnamen die een DictReader heeft gelezen of de verwachte uitvoersleutels en volgorde die aan een DictWriter zijn opgegeven.
Een aanroep van writeheader() op een DictWriter drukt de namen af in de ingestelde volgorde van fieldnames.
FileExistsError
Een FileExistsError signaleert een bewerking die een ongebruikt pad vereist terwijl er al iets op die locatie bestaat.
Een bestaand rapport openen met modus "x" werpt FileExistsError op in plaats van de inhoud te vervangen.
FileNotFoundError
Een FileNotFoundError signaleert dat een gevraagd bestand of een gevraagde map niet kan worden gevonden op het pad dat een bestandssysteembewerking gebruikt.
Een verkeerde startmap kan ervoor zorgen dat een relatief invoerpad FileNotFoundError opwerpt, ook als het bestand elders bestaat.
finally-clausule
Een finally-clausule voert opruimwerk uit wanneer de uitvoering een try-instructie verlaat, ook voordat een wachtende terugkeer wordt voltooid of een niet-afgehandelde exceptie wordt doorgegeven.
Een afsluitende melding in finally wordt ook afgedrukt wanneer een conversie mislukt en geen bijbehorende exceptieafhandelaar met het type overeenkomt.
foutherstel per record
Foutherstel per record handelt een verwachte fout in een record binnen de verwerkingslus af, zodat latere records waar toegestaan nog kunnen worden bekeken.
Een snelle samenvatting meldt een ongeldige hoeveelheid en verhoogt een teller voor overgeslagen records voordat het volgende CSV-record wordt gelezen.
foutmelding
Een foutmelding beschrijft een mislukte bewerking of afgewezen waarde, zodat de lezer kan begrijpen wat er gebeurde en wat moet worden hersteld.
De melding “pages must be positive, got -2” is bruikbaarder dan alleen het woord “error”.
fysiek regelnummer
Een fysiek regelnummer telt daadwerkelijke bestandsregels, wat kan verschillen van het aantal CSV-records wanneer een veld tussen aanhalingstekens een regeleinde bevat.
De line_num van de lezer geeft de laatst gelezen regel aan voor een record dat twee regels beslaat.

G

gecontroleerde foutafhandeling
Gecontroleerde foutafhandeling is een beheerste reactie op een probleem, waarbij bruikbare informatie wordt gegeven en het programma afhankelijk van de taak doorgaat of stopt.
Een ontbrekend rapportbestand leidt tot een duidelijk verzoek om een gecorrigeerd pad in plaats van een verwarrende programmafout voor de gebruiker.
gedelegeerde exceptieafhandeling
Gedelegeerde exceptieafhandeling laat een exceptie over aan aanroepende code die de context heeft om een bruikbare herstelactie voor de grotere taak te kiezen.
Een hulpfunctie voor gegevens meldt de fout, terwijl het opdrachtregelgedeelte beslist of het opnieuw probeert, een bestand overslaat of stopt.
gesloten bestand
Een gesloten bestand is een bestandsobject waarvan de toegang tot het onderliggende bestand is beëindigd, zodat verder lezen of schrijven via dat object niet mogelijk is.
Nadat een with-blok waarin een bestand als f is geopend, is geëindigd, is f.closed gelijk aan True en werpt f.read() een ValueError op over toegang tot een gesloten bestand.
globpatroon
Een globpatroon selecteert paden op basis van een naampatroon, waarbij een jokerteken zoals * overeenkomt met wisselende tekst binnen de geselecteerde map.
Path("logs").glob("*.txt") vindt overeenkomende paden naar tekstbestanden; door ze te sorteren krijg je een voorspelbare verwerkingsvolgorde.

H

huidige werkmap
De huidige werkmap is de huidige map van het proces, die Python gebruikt als beginlocatie bij het interpreteren van relatieve paden.
python tools/report.py uitvoeren vanuit de hoofdmap van het project verplaatst de uitvoering op zichzelf niet naar de map tools.

I

IndexError
Een IndexError signaleert het opzoeken in een sequentie op een positie die niet bestaat, zoals indexeren voorbij het einde van een lijst.
Een korte CSV-rij met één veld werpt IndexError op wanneer code op basis van positie het tweede veld probeert te benaderen.
IsADirectoryError
Een IsADirectoryError signaleert een bewerking die een bestand verwacht maar op de gevraagde locatie een map aantreft.
Op systemen die dit geval onderscheiden, werpt het openen van een map als gewoon invoerbestand IsADirectoryError op.

K

KeyboardInterrupt
Een KeyboardInterrupt signaleert een onderbreking door de gebruiker, meestal Ctrl+C, en valt rechtstreeks onder BaseException in plaats van Exception.
Een kale except: kan Ctrl+C opvangen, terwijl except Exception: de onderbreking laat doorgeven.
KeyError
Een KeyError signaleert het opzoeken van een ontbrekende sleutel in een dictionary, waaronder een kolomnaam die niet overeenkomt met de gevraagde sleutel.
Het opzoeken van row["name"] mislukt wanneer de kopregel van de tabel in plaats daarvan de sleutel "Name" heeft aangemaakt.
kopregel
Een kopregel is een rij met kolomnamen die de velden in een tabel aanduidt en vaak vóór de gegevensrecords in een CSV-bestand staat.
De rij product,stock,price benoemt kolommen en mag niet als gegevens worden doorgegeven aan een conversie naar gehele getallen.

L

logische fout
Een logische fout zorgt ervoor dat een programma door onjuiste redeneringen of bewerkingen een verkeerd resultaat oplevert, zonder dat daarvoor een exceptie nodig is.
Delen door het verkeerde aantal dat niet nul is, kan een aannemelijk gemiddelde opleveren terwijl het programma volledig wordt uitgevoerd.

M

mappen aanmaken
Mappen aanmaken creëert mappen in het bestandssysteem; mkdir(parents=True) kan ook ontbrekende mappen boven de gevraagde map aanmaken.
Maak output/daily aan voordat je het rapport daarin schrijft, want een nieuw uitvoerbestand openen maakt geen mappen aan.

N

naambinding van een exceptie
Een naambinding van een exceptie geeft via as een naam aan een opgevangen foutobject, zodat het type of de melding ervan binnen die exceptieafhandelaar kan worden bekeken.
In except ValueError as err: toont het afdrukken van err de melding; de binding wordt daarna verwijderd.
NameError
Een NameError signaleert het gebruik van een naam zonder beschikbare binding, vaak omdat de naam verkeerd is gespeld of nooit een waarde heeft gekregen.
Een exceptieafhandelaar die een niet-gedefinieerde variabele afdrukt, werpt NameError op terwijl hij het oorspronkelijke probleem probeert te melden.

O

ontbrekend veld
Een ontbrekend veld is een waarde die in een kort CSV-record ontbreekt; een standaard ingestelde DictReader vult de bekende sleutel uit de kopregel met None.
Onder name,score heeft de rij Ana een ontbrekende score; Ana, bevat daarentegen een lege scorestring.
opnieuw opwerpen
Opnieuw opwerpen geeft de actieve opgevangen exceptie door met een kale raise, zodat lokaal kan worden gereageerd zonder de fout als opgelost te behandelen.
Een lezer drukt het ontbrekende pad af en werpt de exceptie opnieuw op, zodat de aanroepende code kan beslissen of om een ander bestand wordt gevraagd.

P

pad
Een pad beschrijft de locatie van een bestand of map met namen en scheidingstekens, beginnend bij een wortel of een andere bekende map.
Het pad data/notes.txt duidt een tekstbestand aan in de map data onder de huidige werkmap.
Path-object
Een Path-object stelt een pad in Python voor en biedt bewerkingen om onderdelen samen te voegen, namen te bekijken en het bestandssysteem te benaderen.
De expressie Path("data") / "scores.txt" stelt een locatie samen die open() rechtstreeks kan accepteren.
PermissionError
Een PermissionError signaleert dat het besturingssysteem de toegang weigert die een bestandssysteembewerking vraagt.
Een invoerbestand kan bestaan maar toch PermissionError opwerpen wanneer het programma geen toestemming heeft om het te lezen.

R

raise-instructie
Een raise-instructie signaleert expliciet een exceptie, onderbreekt het normale pad en begint de zoektocht naar een overeenkomende exceptieafhandelaar.
Een functie wijst een niet-positief bedrag vóór het rekenen af met raise ValueError("amount must be positive").
record
Een record is één volledige rij met CSV-velden; die beslaat meestal één fysieke regel, maar kan door een veld tussen aanhalingstekens meerdere regels beslaan.
Een adres tussen aanhalingstekens dat een regeleinde bevat, blijft één record wanneer de CSV-module het leest.
recordafsluiting
Een recordafsluiting is de tekenreeks die een CSV-schrijver na een rij toevoegt; de standaardschrijver gebruikt "\r\n".
Door te openen met newline="" kan de schrijver zijn eigen afsluitingen toevoegen zonder een tweede omzetting.
regeleindeteken
Een regeleindeteken, geschreven als "\n" in een Pythonstring, markeert een regeleinde; de laatste regel van een bestand hoeft geen regelafsluiting te hebben.
Een regel afdrukken die al eindigt op "\n" voegt nog een regeleindeteken toe, tenzij de afsluiting van de afdruk wordt gewijzigd.
regelfilter
Een regelfilter selecteert tijdens het lezen van een bestand records op basis van een voorwaarde, zodat het programma alleen de regels kan behouden die voor een taak relevant zijn.
Een logfilter controleert het niveauveld en schrijft alleen records waarvan het niveau gelijk is aan "ERROR".
relatief pad
Een relatief pad geeft een locatie aan vanuit de huidige werkmap van het proces, zodat de betekenis afhangt van die beginmap.
Als je in project/scripts begint, verwijst ../data/notes.txt naar de naastgelegen gegevensmap van het project.
ruwe string
Een ruwe string gebruikt een r-voorvoegsel zodat backslashes als letterlijke tekens behouden blijven in plaats van als gewone escapesequenties te worden geïnterpreteerd.
De literal r"C:\new\table.txt" behoudt de scheidingstekens die anders escapesequenties voor een regeleinde en een tab zouden beginnen.

S

scheidingsteken
Een scheidingsteken is het teken dat velden in een tabelformaat scheidt, zoals een komma, puntkomma of tab die voor een CSV-lezer is gekozen.
Een exportbestand met puntkomma’s heeft delimiter=";" nodig zodat een lezer name;score in twee velden splitst.
specifieke exceptieafhandelaar
Een specifieke exceptieafhandelaar vangt een nauw afgebakende exceptieklasse op, zodat verwachte problemen verschillende meldingen kunnen krijgen zonder elke programmeerfout te verbergen.
Plaats FileNotFoundError vóór OSError wanneer een ontbrekend bestand een andere reactie vereist dan andere bestandsproblemen.
stacktrace
Een stacktrace toont de aanroepketen die tot een niet-afgehandelde exceptie leidt en eindigt met het exceptietype en een verklarende melding.
Het onderste aanroeponderdeel kan aangeven dat delen door de lengte van een lege lijst de bewerking is die mislukte.
SystemExit
Een SystemExit signaleert een bedoelde beëindiging van een proces en wordt door sys.exit() opgeworpen buiten de gewone tak van Exception.
De aanroep sys.exit("Missing data") werpt SystemExit op met een melding en een foutstatus die een gewone Exception-afhandelaar niet opvangt.

T

tekencodering
Een tekencodering is een geheel van regels om tekens als bytes weer te geven, gebruikt bij het schrijven van tekst en het interpreteren van opgeslagen tekst.
De tekst “café” kan verminkt raken als een lezer een andere tekencodering gebruikt dan die waarmee de tekst is opgeslagen.
tekstbestand
Een tekstbestand slaat tekens op als gecodeerde bytes, meestal ingedeeld in regels, en bewaart zijn gegevens nadat het schrijvende programma is geëindigd.
Een programma leest aan het begin van de volgende uitvoering een opgeslagen lijst met scores uit een tekstbestand.
toevoegmodus
De toevoegmodus opent een bestand zodat nieuwe uitvoer aan het einde wordt toegevoegd terwijl bestaande inhoud behouden blijft; een ontbrekend bestand wordt aangemaakt.
Als je "a" gebruikt voor uitvoeringsmeldingen, blijven eerdere uitvoeringen bewaard, maar de melding heeft nog steeds een eigen regeleindeteken nodig.
try-blok
Een try-blok bevat bewerkingen waarvan excepties kunnen worden afgehandeld door de bijbehorende clausules; bij een fout wordt de resterende code overgeslagen.
Een invoerconversie hoort in een klein try-blok zodat een ongeldige waarde kan leiden tot een vraag om nieuwe invoer.
TypeError
Een TypeError signaleert een bewerking op een ongeschikte soort object of een onverenigbare combinatie van objecttypen.
"5" en 3 optellen werpt TypeError op omdat het optellen van strings geen geheel getal als tweede operand accepteert.

U

UnicodeDecodeError
Een UnicodeDecodeError signaleert dat opgeslagen bytes niet kunnen worden gedecodeerd volgens de gekozen regels voor het interpreteren van tekst.
Een tekstlezer kan UnicodeDecodeError opwerpen wanneer de daadwerkelijke tekencodering van het bestand niet overeenkomt met encoding="utf-8".
UTF-8
UTF-8 is een tekencodering die elk Unicodeteken kan weergeven en een wisselend aantal bytes per teken gebruikt.
Gebruik encoding="utf-8" wanneer je een als UTF-8 opgeslagen tekstbestand opent, zodat letters met accenten correct worden gedecodeerd.

V

validatie
Validatie controleert of invoer voldoet aan de eisen van een bewerking voordat het programma die invoer gebruikt om een resultaat te produceren.
Een opnamefunctie controleert vóór het aftrekken of het bedrag positief is en het saldo niet overschrijdt.
ValueError
Een ValueError signaleert dat een bewerking een toegestane soort object heeft ontvangen, maar met een waarde die ze voor die taak niet kan interpreteren of accepteren.
De string "3.5" is een toegestaan invoertype voor int(), maar is geen string met een geheel getal en werpt ValueError op.
veld
Een veld is één betekenisvol onderdeel van een record, gescheiden of aangeduid volgens een bekende indeling, zoals een logniveau of een CSV-hoeveelheid.
In een logbestand met datum, tijd, niveau en bericht voorkomt controle van het niveau dat een woord binnen het bericht overeenkomt.
velden tussen aanhalingstekens plaatsen
Velden tussen aanhalingstekens plaatsen houdt in dat een veld wordt omgeven door aanhalingstekens zodat een scheidingsteken of regeleinde binnen de waarde deel van dat veld blijft.
De lezer behoudt de komma binnen "River, West", terwijl gewoon op komma’s splitsen die naam zou opdelen.

W

with-instructie
Een with-instructie betreedt een beheerd blok en regelt het opruimen wanneer de uitvoering het blok verlaat; bij een geopend bestand wordt het bestand daarbij gesloten.
Een bestand dat in een with-blok is geopend, sluit ook wanneer het omzetten van een regel binnen het blok een fout opwerpt.
witruimte aan de randen verwijderen
Witruimte aan de randen verwijderen haalt witruimtetekens aan het begin of einde van tekst weg, waaronder spaties, tabs en regelafsluitingen.
Na line.strip() wordt een regel met alleen spaties en een regeleindeteken een lege string.
writerow
De methode writerow schrijft één sequentie van veldwaarden als een CSV-record, inclusief benodigde scheidingstekens, aanhalingstekens en een recordafsluiting.
Gebruik writer.writerow(["Ana", 8.5]) voor een record met twee velden, geen vooraf samengevoegde string.
writerows
De methode writerows schrijft een sequentie van rijen en behandelt elke opgegeven rij als een sequentie van velden voor één CSV-record.
Een lijst met lijsten van namen en scores kan aan writerows() worden doorgegeven om meerdere records in één aanroep op te slaan.

Z

zelfgedefinieerde exceptie
Een zelfgedefinieerde exceptie is een door het programma gedefinieerde foutklasse waarmee aanroepende code een bepaald probleem kan onderscheiden van andere fouten.
Een InsufficientFundsError kan leiden tot een vraag om een lager bedrag, terwijl andere ongeldige waarden een andere reactie krijgen.
ZeroDivisionError
Een ZeroDivisionError signaleert een deling of verwante rekenkundige bewerking met een deler die nul is, waardoor geen numeriek resultaat mogelijk is.
Een berekening van een gemiddelde werpt ZeroDivisionError op als de lijst leeg is en de lengte ervan als deler wordt gebruikt.

Over deze les

Door StudeliFout melden

Maak je eigen Studiemateriaal

Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.

Aan de slag