2.27. Lezen en schrijven

Bestanden bevinden zich op schijf; Python bereikt ze via open(), die een bestandsobject retourneert waarvan de methoden de onderliggende bytes lezen en schrijven.

2.27.1. open en modi

Het eerste argument is het pad; het tweede is de modus – een korte string die Python vertelt hoe het bestand zal worden gebruikt:

  • "r" – lezen (standaard). Opent een bestaand bestand om te lezen.

  • "w" – schrijven. Maakt een nieuw bestand aan of kapt een bestaand bestand af tot leeg.

  • "a" – toevoegen. Opent een bestand om te schrijven aan het einde ervan zonder af te kappen.

  • "b" toegevoegd aan een van bovenstaande ("rb", "wb", "ab") – binaire modus. De inhoud van het bestand is bytes in plaats van str.

f = open("notes.txt", "r")
text = f.read()
f.close()

2.27.2. Gebruik een contextmanager

Het bovenstaande patroon lekt de bestandshandle als er iets tussen open() en close opwerpt. De oplossing is de with-instructie (zie contextmanagers):

with open("notes.txt") as f:
    text = f.read()

# f is closed here, even if read() failed

Dit is de standaardvorm – schrijf het elke keer op deze manier.

2.27.3. Lezen

Bestandsobjecten ondersteunen verschillende leesstijlen:

  • io.IOBase.read() – lees het hele bestand (of N bytes) en retourneer het als een enkele string (of bytes-object).

  • io.IOBase.readline() – lees één regel, inclusief de afsluitende "\n".

  • Het bestand rechtstreeks itereren levert regels één voor één op, met veel minder geheugengebruik dan het hele bestand in één keer lezen.

with open("log.txt") as f:
    for line in f:
        print(line.rstrip())

str.rstrip() verwijdert de afsluitende nieuwe regel vóór het afdrukken, zodat de uitvoer niet dubbel gespatieerd is.

2.27.4. Schrijven

Open het bestand in de "w"-modus en gebruik io.IOBase.write():

with open("out.txt", "w") as f:
    f.write("hello\n")
    f.write("world\n")

io.IOBase.write() voegt geen nieuwe regel toe – het schrijft precies de bytes (of tekens, in tekstmodus) die je het geeft.

2.27.5. Tekst vs binair

Tekstmodus (standaard, "r" / "w" zonder "b") decodeert binnenkomende bytes naar str met een standaardcodering, en codeert uitgaande str terug naar bytes. Gebruik het voor configuratie, logs, JSON – alles wat tekst is.

Binaire modus ("rb" / "wb") slaat de decodeerstap over en retourneert bytes. Gebruik het voor afbeeldingen, struct-gepakte records, netwerkopnamen – alles waar elke byte telt en het bestand niet voor mensen leesbaar is.

2.27.6. Bestanden weergeven en verwijderen

De module os legt de bestandssysteembewerkingen bloot die niet op het bestandsobject zelf zitten:

import os

for name in os.listdir("/"):
    print(name)

Vang OSError rond deze op wanneer het bestand of de directory er mogelijk niet is – de bewerking is een van de gangbare plaatsen waar uitzonderingen in echte scripts opduiken.