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.