0%

Hoofdstuk 5

Bestanden lezen en schrijven

Paden vanaf de projecthoofdmap

In hoofdstuk 2 leerde je hoe de shell een bestand vindt vanuit zijn werkmap. Python gebruikt dezelfde kaart.

In de editor naast deze les is reading_log.py geopend. De eerste regels benoemen drie bestanden:

from pathlib import Path

BOOKS_PATH = Path("data") / "books.txt"
REPORT_PATH = Path("reading_report.txt")
HISTORY_PATH = Path("reading_history.txt")

pathlib hoort bij de standaardbibliotheek van Python, dus je hoeft niets te installeren. Met Path krijgt een bestandssysteempad een eigen soort waarde. De / tussen twee paddelen voegt ze samen; er wordt niets gedeeld.

Een pad is een naam, niet de inhoud

BOOKS_PATH beschrijft data/books.txt. Door die waarde te maken open je het bestand niet, controleer je niet of het bestaat en lees je er geen enkele byte uit. Dat onderscheid is nuttig: je programma kan bepalen welk bestand het wil voordat het een bestandsbewerking uitvoert.

Het project ziet er nu zo uit:

reading_log.py
README.txt
data/
    books.txt

De andere twee paden bestaan nog niet. Latere lessen maken ze aan.

Relatief ten opzichte van wat?

Geen van de drie paden begint bij de hoofdmap van een bestandssysteem. Het zijn paden ten opzichte van het project: Python interpreteert ze vanuit de werkmap van het proces.

Als je python reading_log.py uitvoert vanuit de projecthoofdmap, wijst data/books.txt naar het meegeleverde invoerbestand. Ga je eerst in data staan, dan zou hetzelfde pad data/data/books.txt betekenen, en dat bestaat niet.

Daarom blijft de gewoonte uit hoofdstuk 2 om pwd te gebruiken belangrijk. Een padfout zit vaak in de plek waar het programma is gestart, niet in de regel die later probeert te lezen.

Je zou een absoluut pad zoals /Users/you/Downloads/books.txt in het programma kunnen plakken. Dat werkt misschien vandaag op één computer, maar mislukt als het project verhuist, een andere cursist het downloadt of Windows de hoofdmap anders aanduidt. Door cursusgegevens binnen het project te houden en ze vanuit de projecthoofdmap te benoemen, kun je de hele map meenemen.

Wat is er gebeurd direct nadat BOOKS_PATH = Path("data") / "books.txt" is uitgevoerd?

Waarom houden we data/books.txt relatief ten opzichte van de projecthoofdmap?

In de volgende les gaan we van het benoemen van books.txt naar het lezen van de tekst erin.