← Python/Bestanden en I/O
Les 1 van 8
MODULE 11 · 01◷ 30 min

Een pad benoemen en de tekst van een bestand lezen

Na deze les kun je
  • Een Path gebruiken voor bestandsnaam en extensie.
  • Een tekstbestand met expliciete UTF8-codering lezen.
  • Een leeg bestand, een map en een ontbrekend pad onderscheiden.

Je programma kent losse strings, lijsten en dictionaries, maar die waarden verdwijnen wanneer de uitvoering stopt. Een tekstbestand kan gegevens bewaren die een volgende uitvoering weer leest. Je begint met het verschil tussen het adres van een bestand en wat erin staat.

Een adres als object

Een pad beschrijft waar een bestand of map gezocht wordt. Met Path uit de standaardbibliotheek pathlib maak je daarvan een object. Dat object biedt herkenbare eigenschappen en bewerkingen voor paden.

Met Path("routes") / "day.txt" voeg je twee onderdelen samen. Die slash is hier een operator van het Path-object. Je hoeft daardoor niet zelf losse scheidingstekens aan strings te plakken.

Een relatief pad begint vanuit de huidige werkmap. De voorbeelden gebruiken tijdelijke lesbestanden in de afgeschermde werkplek. Die worden per uitvoering opnieuw klaargezet; je hebt daarvoor geen eigen bestanden op je computer nodig.

Naam en extensie beschrijven nog geen inhoud

De eigenschap name geeft het laatste onderdeel als string. De eigenschap suffix geeft de laatste extensie met haar punt. Bij een naam zonder extensie is die waarde een lege string.

Voor deze eigenschappen hoeft het bestand niet te bestaan. Je beschrijft alleen de vorm van het pad. Het eerste voorbeeld laat daarnaast de echte tekst lezen, zodat je naam en inhoud naast elkaar ziet.

Naam, extensie en echte tekst uit elkaar houden
routes/day.txt
We lopen door het park.
read_route.py
from pathlib import Path

path = Path("routes") / "day.txt"
print(path.name)
print(path.suffix)
print(path.read_text(encoding="utf-8"), end="")
Verwachte uitvoer
day.txt
.txt
We lopen door het park.

Een naam met meerdere punten kan verschillende delen hebben. Bij bundel.tar.gz is de laatste extensie .gz. De naam zelf blijft bundel.tar.gz; de extensie opvragen verandert het pad niet.

Bytes als tekst interpreteren

Een bestand bewaart bytes. Een tekencodering beschrijft hoe die bytes tekst vormen; je kent UTF8 al uit de tekstmodule. Met read_text(encoding="utf-8") kies je die afspraak expliciet.

De methode opent het bestand, leest de tekst en sluit het weer. De retourwaarde is een gewone Python-string. Je kunt daarop later bekende stringbewerkingen toepassen.

Lees eerst de inhoud voordat je haar verandert. Een afsluitende newline of spaties kunnen bij de gegevens horen. strip() gebruiken bij iedere leesactie zou die tekens alvast verwijderen, ook wanneer de aanroeper ze wil behouden.

Veelgemaakte fout: leeg verwarren met afwezig

Een leeg tekstbestand levert een lege string op. Een ontbrekend bestand kan niet worden geopend en geeft FileNotFoundError. Het tweede voorbeeld toont beide werkelijke uitkomsten.

Een lege inhoud verschilt van een ontbrekend bestand
empty.txt
read_empty.py
from pathlib import Path

print(repr(Path("empty.txt").read_text(encoding="utf-8")))
try:
    Path("missing.txt").read_text(encoding="utf-8")
except FileNotFoundError as error:
    print(type(error).__name__)
Verwachte uitvoer
''
FileNotFoundError

Een map kan eveneens bestaan, maar is geen gewoon tekstbestand. Met is_file() vraag je naar een gewoon bestand; bij de gewone ontbrekende paden in deze les krijg je False. Een leeg bestand geeft juist True.

Een eerdere controle biedt geen garantie dat een latere leesactie altijd lukt: de bestandstoestand kan veranderen. In deze oefening laat je een leesfout daarom gewoon doorlopen. Je maakt een ontbrekend bestand niet stilzwijgend aan.

Vier kleine hulpmiddelen voor notities

Vul de functies in notes.py in. De ene functie beschrijft een pad, de andere leest of onderzoekt een echt bestand. De meegeleverde notitie kun je bekijken; de lescontrole gebruikt daarnaast verschillende tijdelijke bestanden met verschillende inhouden.

Behoud bij lezen de tekst zoals die in de gebruikte UTF8-lesbestanden met LF-regelovergangen staat. Geef metadata als gewone strings of booleans terug. Geen van de vier hulpmiddelen hoeft een bestand te veranderen.

AAN DE SLAG 0/4
1

De laatste naam opvragen

Vul file_name(path) in: geef het laatste onderdeel als string terug. Het pad hoeft daarvoor niet te bestaan.

2

De laatste extensie opvragen

Vul suffix_name(path) in: geef de laatste extensie inclusief punt terug, of een lege string als die ontbreekt.

3

Een volledige notitie lezen

Vul read_note(path) in: lees de volledige UTF8-tekst met behoud van spaties en regels. Wijzig het bestand niet en laat FileNotFoundError voor een ontbrekend bestand doorlopen.

4

Een bestand van een map onderscheiden

Vul regular_file(path) in: geef een bool die zegt of het pad naar een gewoon bestand verwijst. Een leeg bestand is geldig; een map of ontbrekend pad geeft False. Wijzig niets.

Onthouden

  • Een Path beschrijft een adres; name en suffix beschrijven onderdelen daarvan.
  • Read_text leest tekst met de gekozen codering en sluit het bestand.
  • Een leeg bestand, een map en een ontbrekend bestand hebben verschillend gedrag.

Hierna open je bestanden zelf en kies je bewust tussen lezen, vervangen, toevoegen en nieuw aanmaken.

notes.py
UitvoerPython
›
›_

Hier komt je resultaat.

Voer je code uit en ontdek
wat je hebt gemaakt.

0/4 stappen
EVEN MEEKIJKEN

Bekijk hoe het kan.

Je mag de oplossing bekijken. Deze poging telt dan niet mee als afgeronde les. Met Reset kun je daarna opnieuw zelf oefenen.