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 isbytesin plaats vanstr.
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:
os.listdir()– retourneert een lijst met namen in een directory.os.remove()– verwijder een bestand.os.rename()– hernoem een bestand.os.stat()– bestandsmetadata (grootte, wijzigingstijd, …).os.mkdir()– maak een nieuwe directory aan.
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.