Python-bestandsverwerking: lezen, schrijven, CSV, JSON en pathlib met voorbeelden

  1. Home
  2. Blog
  3. Softwareontwikkeling

Softwareontwikkeling

Python-bestandsverwerking: Lezen, schrijven, CSV, JSON en pathlib met voorbeelden

Bijna elk echt script leest of schrijft een bestand. Leer de veilige manier om bestanden te openen, kies de juiste modus, ga om met CSV en JSON, werk met paden met behulp van pathlib en vermijd de fout die uw gegevens wist.

9 min leestijd
Python-bestandsverwerking: lezen, schrijven, CSV, JSON en pathlib met voorbeelden

Belangrijkste punten

  • Open bestanden altijd met een with blok, zodat ze automatisch sluiten.
  • Modus "w" wist een bestaand bestand. Gebruik "a" om iets toe te voegen, of "x" om overschrijven te weigeren.
  • Loop over het bestandsobject om grote bestanden te lezen zonder alles in het geheugen te laden.
  • Ga expliciet voorbij aan encoding="utf-8" en geef de voorkeur aan pathlib voor het bouwen van paden.

Logboeken, rapporten, configuratie, export: vroeg of laat raakt elk script het bestandssysteem. Het verwerken van Python-bestanden is in het begin eenvoudig, maar een paar details bepalen of uw code betrouwbaar is of stilletjes gegevens vernietigt.

Deze gids behandelt tekstbestanden, CSV, JSON, binaire gegevens en paden, met de nadruk op veilige gewoonten. We hebben deze voorbeelden uitgevoerd op Python 3.13 in een tijdelijke map, en de getoonde uitvoer is afkomstig van die run.

Open bestanden met open() en with

De ingebouwde functie open() retourneert een bestandsobject. Gebruik het in een with blok:

with open("notes.txt", "w", encoding="utf-8") as file:
    file.write("first line\n")
    file.write("second line\n")

print(file.closed)

# True

Wanneer het blok eindigt, sluit Python het bestand, zelfs als er een fout in het bestand is opgetreden. Zonder with moet je zelf close() aanroepen, en een uitzondering kan die regel overslaan. Als u een bestand gebruikt nadat het is gesloten, treedt er een fout op:

file.read()

# ValueError: I/O operation on closed file.

Bestandsmodi

Het tweede argument bij open() zegt wat u van plan bent te doen:

Modus Betekenis Als het bestand bestaat Als dit niet het geval is
r Lezen (standaard) Opent het Fout
w Schrijf Wist het eerst Creëert het
een Toevoegen Voegt toe aan het einde Creëert het
x Exclusief creëren Fout Creëert het
r+ Lezen en schrijven Opent het Fout

Voeg b toe voor binaire gegevens, zoals in "rb" of "wb". Tekst is de standaardinstelling en kan ook expliciet worden geschreven als t.

Schrijf en voeg toe

write() voegt geen regeleinde toe, dus voeg \n zelf toe. Door toe te voegen blijft wat er al is:

with open("notes.txt", "a", encoding="utf-8") as file:
    file.write("third line\n")

Vergelijk dat eens met modus "w", die onze drie regels verving door één, zonder enige waarschuwing:

with open("notes.txt", "w", encoding="utf-8") as file:
    file.write("replaced\n")

# notes.txt now contains only: replaced

Als je iets niet mag overschrijven, gebruik dan "x". Het leverde FileExistsError op in onze test, omdat notes.txt al bestond.

Een bestand lezen

Er zijn verschillende manieren om te lezen, en de juiste keuze hangt af van de bestandsgrootte:

Benadering Retouren Beste voor
file.read() Eén string met alles Kleine bestanden
file.readline() De volgende regel Een kop lezen
file.readlines() Een lijst met lijnen Kleine bestanden die je nodig hebt als lijst
voor regel in bestand Eén regel tegelijk Elk formaat, vooral grote bestanden
with open("notes.txt", encoding="utf-8") as file:
    print(repr(file.read()))

# 'first line\nsecond line\n'

with open("notes.txt", encoding="utf-8") as file:
    for line in file:
        print(line.strip())

# first line
# second line
# third line

Let op de \n-tekens die in de onbewerkte tekenreeks worden bewaard. strip() verwijdert ze. Een bestandsobject onthoudt ook zijn positie, dus het lezen gaat verder waar het was gebleven:

with open("notes.txt", encoding="utf-8") as file:
    print(file.readline().strip())
    print(file.readlines())

# first line
# ['second line\n', 'third line\n']

Het doorlussen van het bestand is de belangrijkste techniek voor grote logboeken en exports. Het leest regel voor regel, dus een bestand van meerdere gigabytes hoeft niet in het geheugen te passen.

Bestandsfouten afhandelen

Bestanden ontbreken mogelijk, zijn vergrendeld of zijn onleesbaar, dus houd daar rekening mee:

try:
    with open("missing.txt", encoding="utf-8") as file:
        data = file.read()
except FileNotFoundError as error:
    print(error)

# [Errno 2] No such file or directory: 'missing.txt'
Uitzondering Typische oorzaak
FileNotFoundFout Het pad bestaat niet
FileExistsFout Modus x op een bestaand bestand
ToestemmingFout Niet toegestaan of vergrendeld op Windows
IsADirectoryError Het pad is een map
UnicodeDecodeFout Er is een verkeerde codering gebruikt

Probeer het bestand te openen en de fout op te sporen, in plaats van eerst te controleren met exists(), aangezien het bestand tussen de controle en de opening zou kunnen verdwijnen. Onze gids voor Python-afhandeling van uitzonderingen behandelt deze aanpak.

CSV-bestanden

Splits CSV-regels niet zelf op komma’s, omdat waarden tussen aanhalingstekens komma’s kunnen bevatten. De standaardmodule csv handelt deze regels af. DictWriter en DictReader zijn de meest leesbare opties:

import csv

with open("orders.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=["id", "customer", "total"])
    writer.writeheader()
    writer.writerow({"id": 1, "customer": "Asha", "total": 1200})
    writer.writerow({"id": 2, "customer": "Ben", "total": 300})

with open("orders.csv", newline="", encoding="utf-8") as file:
    rows = list(csv.DictReader(file))

print(rows[0])
print(sum(int(r["total"]) for r in rows))

# {'id': '1', 'customer': 'Asha', 'total': '1200'}
# 1500

Twee details zijn belangrijk. Voer newline="" uit bij het openen van CSV-bestanden, zoals de documentatie aanbeveelt, om lege rijen op Windows te voorkomen. En elke waarde komt terug als een string, even getallen, daarom hadden we int() nodig in de som. Voor zwaar datawerk kan een bibliotheek zoals Panda’s beter geschikt zijn.

JSON-bestanden

JSON is het gebruikelijke formaat voor configuratie- en API-gegevens. Het komt netjes overeen met Python-woordenboeken en vermeldt:

import json

config = {"debug": True, "retries": 3, "hosts": ["a", "b"]}

with open("config.json", "w", encoding="utf-8") as file:
    json.dump(config, file, indent=2)

with open("config.json", encoding="utf-8") as file:
    print(json.load(file)["retries"])

# 3

Onthoud de naamgeving: dump en load werken met bestanden, terwijl dumps en loads met tekenreeksen werken. Typen zoals datums kunnen niet rechtstreeks worden opgeslagen, dus u zult ze eerst naar tekenreeksen moeten converteren.

Werk met paden met behulp van pathlib

Het aan elkaar lijmen van paden met tekenreeksen over besturingssystemen heen. De standaardmodule pathlib handelt scheidingstekens voor u af en biedt handige snelkoppelingen:

from pathlib import Path

path = Path("data") / "reports" / "summary.txt"
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text("all good\n", encoding="utf-8")

print(path.read_text(encoding="utf-8").strip())   # all good
print(path.suffix, path.stem, path.exists())      # .txt summary True
print(sorted(p.name for p in Path(".").glob("*.csv")))
# ['orders.csv']
Taak padlib
Sluit je aan bij paden Pad("a") / "b.txt"
Maak mappen path.mkdir(parents=Waar, exist_ok=Waar)
Lees of schrijf de hele tekst read_text(), write_text()
Zoek bestanden glob("*.csv"), rglob("*.py")
Verwijder een bestand path.unlink()
Haal de map van het huidige script op Path(__file__).parent

Dat laatste lost een veelvoorkomende hoofdpijn op. Relatieve paden worden opgelost vanaf de plek waar u het script uitvoerde, en niet vanaf de plek waar het script zich bevindt. Als u dus paden bouwt vanuit Path(__file__).parent, worden veel verrassingen “bestand niet gevonden” vermeden.

Binaire bestanden

Afbeeldingen, PDF’s en ZIP-bestanden zijn geen tekst. Open ze met b, en je leest en schrijft bytes, zonder dat er codering bij betrokken is:

with open("pixel.bin", "wb") as file:
    file.write(bytes([255, 0, 128]))

with open("pixel.bin", "rb") as file:
    print(file.read())

# b'\xff\x00\x80'

Veiliger schrijft

Als een programma halverwege het schrijven van een belangrijk bestand crasht, kan het resultaat beschadigd zijn. Een veel voorkomende oplossing is om eerst naar een tijdelijk bestand te schrijven en het vervolgens op zijn plaats te wisselen:

temp = Path("settings.tmp")
temp.write_text("new", encoding="utf-8")
temp.replace("settings.txt")

print(Path("settings.txt").read_text(), temp.exists())

# new False

replace() overschrijft de bestemming. Op hetzelfde bestandssysteem is de hernoeming over het algemeen atomair, zodat lezers het oude of het nieuwe bestand zien in plaats van een halfgeschreven mix.

Tip: Bouw nooit bestandspaden rechtstreeks op basis van gebruikersinvoer zonder deze te controleren. Een waarde als ../../secrets.txt kan bestanden buiten de beoogde map bereiken. Dit staat bekend als een kwetsbaarheid voor padtraversal.

Een praktisch voorbeeld: een logboek samenvatten

Dit korte script brengt verschillende ideeën samen. Het leest een log regel voor regel, dus de grootte doet er niet toe, telt elk niveau met behulp van Counter, en schrijft een samenvatting naar een nieuw bestand:

from collections import Counter

counts = Counter()
with open("app.log", encoding="utf-8") as file:
    for line in file:
        counts[line.split()[0]] += 1

with open("summary.txt", "w", encoding="utf-8") as out:
    for level, total in counts.most_common():
        out.write(f"{level}: {total}\n")

# summary.txt
# ERROR: 2
# INFO: 2
# WARN: 1

Ons voorbeeldlogboek bestond uit vijf regels. Een lege regel zou breken line.split()[0], dus echte scripts moeten eerst lege regels overslaan.

Veel voorkomende fouten

  • Gebruik "w" terwijl je "a" bedoelde. Je bestaande gegevens zijn onmiddellijk verdwenen, zelfs als je nooit iets schrijft.
  • De codering wordt weggelaten. De standaardwaarde varieert per systeem, dus een script dat op Linux werkt, kan mislukken op Windows met tekst met accenten of emoji.
  • Het aanroepen van read() voor grote bestanden. Dit kan het geheugen uitputten, dus maak in plaats daarvan een lus over de regels.
  • int() vergeten voor CSV-waarden. "10" + "20" geeft "1020".
  • We laten newline="" weg voor CSV. Mogelijk krijg je onverwacht lege rijen in Windows.
  • De bestandscode niet testen. Gebruik de tmp_path-fixture van pytest zodat tests nooit echte bestanden raken. Bekijk onze pytest-tutorial.

Tot slot

Een paar gewoonten omvatten hier bijna alles: gebruik with, stel de codering in, denk twee keer na over "w" en laat csv, json en pathlib de moeilijke delen doen. Om te oefenen schrijft u een klein script dat een CSV leest, één kolom telt en een JSON-samenvatting opslaat in een nieuwe map.

Veelgestelde vragen

Hoe lees ik een bestand regel voor regel in Python?

Open het in een with-blok en loop over het bestandsobject. Dit leest één regel tegelijk, dus het werkt goed, zelfs voor zeer grote bestanden.

Wat is het verschil tussen w en a-modus?

In de modus wordt alle bestaande inhoud gewist zodra het bestand wordt geopend. Modus a behoudt bestaande inhoud en voegt nieuwe gegevens toe aan het einde van het bestand.

Waarom zou ik met gebruiken om een ​​bestand te openen?

De instructie with sluit het bestand automatisch wanneer het blok eindigt, zelfs als er een fout optreedt. Dit voorkomt lekken en zorgt ervoor dat gegevens worden geschreven.

Hoe controleer ik of een bestand bestaat in Python?

Gebruik Path(“name.txt”).exists() uit pathlib. Als u van plan bent het direct daarna te openen, is het opvangen van FileNotFoundError meestal betrouwbaarder dan eerst controleren.

Waarom bevat mijn CSV lege regels in Windows?

Waarschijnlijk hebt u het bestand geopend zonder newline=””. De csv-module beheert zelf de regeleinden, dus geef dat argument door om extra lege rijen te voorkomen.

Blijf leren

Werk met Stack Quora

Hulp nodig met testen, WordPress of SEO?

We helpen teams betere software te leveren en hun sites te laten groeien. Vertel ons waar u mee bezig bent en wij stellen een duidelijke volgende stap voor.

Blijf lezen

Meer handleidingen over testen, AI en moderne ontwikkeling

Genoten van dit artikel? Kies een onderwerp en ga direct naar onze nieuwste tutorials.

Kunstmatige intelligentie

AI-hallucinaties uitgelegd: waarom taalmodellen dingen verzinnen en hoe ze te verminderen

AI-hallucinaties uitgelegd: wat ze zijn, waarom taalmodellen ze produceren, veelvoorkomende typen, hoe je ze kunt verminderen met aarding en aanwijz…

Lees artikel →
DevOps

Omgevingsvariabelen uitgelegd: .env-bestanden, geheimen en configuratie goed gedaan

Omgevingsvariabelen uitgelegd met Python-voorbeelden die we hebben uitgevoerd: ze lezen en instellen, waarom elke waarde een string is, .env-bestand…

Lees artikel →
Softwareontwikkeling

API-snelheidsbeperking uitgelegd: algoritmen, headers en afhandeling van 429-fouten

API-snelheidsbeperking uitgelegd met een simulatie die we hebben uitgevoerd: token-bucket, vast venster, schuifvenster, 429 reacties, headers van sn…

Lees artikel →
Testautomatisering

Spotten in Python: unittest.mock, patch en de fouten die tests doen liegen

Spotten in Python met unittest.mock, getest: Mock en return_value, side_effect, patchen waar een naam wordt gebruikt, spec en autospec, spotdatums e…

Lees artikel →
Softwaretesten

Codedekking uitgelegd: lijn versus filiaaldekking en wat 100% werkelijk betekent

Codedekking uitgelegd met een echte dekking.py-run: dekking van lijnen, vertakkingen en condities, een rapport lezen, waarom 100% dekking nog steeds…

Lees artikel →
Databases & SQL

DELETE versus TRUNCATE versus DROP in SQL: verschillen, terugdraaien en wanneer elk te gebruiken

DELETE versus TRUNCATE versus DROP uitgelegd met geteste SQL: wat elk verwijdert, terugdraaien, triggers, identiteitsreset, snelheid en hoe PostgreS…

Lees artikel →
Databases & SQL

SQL-weergaven uitgelegd: creëer, gebruik en vermijd de valkuilen, met voorbeelden

SQL-weergaven uitgelegd met query's die we hebben uitgevoerd: een weergave maken, live resultaten, kolommen verbergen, prestaties, bijwerkbare en ge…

Lees artikel →
Softwareontwikkeling

TypeScript-interface versus type: echte verschillen, getest met de compiler

TypeScript-interface versus type, gecontroleerd met de echte compiler: wat beide kunnen doen, wat slechts één kan doen, samenvoegen van declaraties,…

Lees artikel →
Softwareontwikkeling

Python *args en **kwargs uitgelegd: flexibele functies met duidelijke voorbeelden

Python *args en **kwargs uitgelegd met code die we hebben uitgevoerd: in- en uitpakken, parametervolgorde, argumenten die alleen trefwoorden en posi…

Lees artikel →
Softwareontwikkeling

Python Lambda-functies: syntaxis, echt gebruik en wanneer u ze niet moet gebruiken

Python lambda-functies uitgelegd met code die we hebben uitgevoerd: syntaxis, sorteren met sleutel, kaart en filter, sluitingen, de laat-bindende va…

Lees artikel →
Kunstmatige intelligentie

Wat zijn AI-agenten? Hoe ze werken, met een eenvoudige agentloop die u kunt uitvoeren

Wat zijn AI-agenten? Een duidelijke gids voor de agentenlus, tools, geheugen en vangrails, met een kleine Python-lus die we hebben uitgevoerd, echte…

Lees artikel →
DevOps

Monitoring versus waarneembaarheid: het echte verschil, met logboeken, statistieken en sporen

Monitoring versus waarneembaarheid uitgelegd: bekende en onbekende fouten, logboeken, statistieken en sporen, een walkthrough voor afrekenincidenten…

Lees artikel →
DevOps

Docker-volumes versus bindingsmounts: bewaar containergegevens op de juiste manier

Docker-volumes versus bind-mounts uitgelegd: waarom containergegevens verdwijnen, benoemde volumes, bind-mounts, tmpfs, Compose-voorbeelden, back-up…

Lees artikel →
Testautomatisering

TDD versus BDD: belangrijkste verschillen, één functie die op beide manieren is gebouwd en wanneer deze moet worden gebruikt

TDD versus BDD uitgelegd met één kortingsfunctie die in beide richtingen is gebouwd: rood-groen-refactor met code die we hebben uitgevoerd, gegeven-…

Lees artikel →
Softwaretesten

Gebruikersacceptatietesten (UAT): proces, checklist en echte voorbeelden

Gebruikersacceptatietesten uitgelegd: wie voert het uit, hoe het verschilt van QA, een proces in zeven stappen, een UAT-testcase-sjabloon, een check…

Lees artikel →
Databases & SQL

SQL NULL-waarden uitgelegd: IS NULL, COALESCE, NULLIF en de te vermijden vallen

SQL NULL-waarden uitgelegd met query's die we hebben uitgevoerd: logica met drie waarden, IS NULL, COALESCE, NULLIF, hoe aggregaten, joins en sorter…

Lees artikel →
Databases & SQL

SQL CASE WHEN-instructie: syntaxis, echte voorbeelden en veelvoorkomende fouten

SQL CASE WHEN uitgelegd met vragen die we hebben uitgevoerd: eenvoudige en doorzochte formulieren, volgorde van de voorwaarden, draaipunten met SUM,…

Lees artikel →
Softwareontwikkeling

Wat is JWT? JSON-webtokens uitgelegd met een werkend voorbeeld

Wat is JWT? JSON Web Tokens uitgelegd: de drie delen, een token gebouwd en waarmee is geknoeid in de code die we hebben uitgevoerd, JWT versus sessi…

Lees artikel →
Softwareontwikkeling

JavaScript-gebeurtenislus uitgelegd: call-stack, microtaken en timers met voorbeelden

De JavaScript-gebeurtenislus uitgelegd met code die we hebben uitgevoerd: call-stack, taak- en microtask-wachtrijen, waarom setTimeout 0 niet onmidd…

Lees artikel →
Softwareontwikkeling

Python-generatoren en opbrengst uitgelegd: bespaar geheugen met echte voorbeelden

Python-generatoren en opbrengst uitgelegd met code die we hebben uitgevoerd: hoe ze pauzeren en hervatten, gemeten geheugenbesparingen, pijplijnen, …

Lees artikel →
Kunstmatige intelligentie

Wat zijn inbeddingen? Vectoren en cosinusovereenkomst eenvoudig uitgelegd

Wat zijn insluitingen? Een gids in duidelijke taal over vectoren, cosinusovereenkomst en semantisch zoeken, met een klein voorbeeld dat we hebben ui…

Lees artikel →
DevOps

Implementatie van blauwgroen versus kanarie: verschillen, afwegingen en hoe te kiezen

Blauw-groen versus kanarie-implementatie uitgelegd: hoe elk werkt, kosten, risico's en terugdraaien, stabiele gebruikersbucket die we hebben getest,…

Lees artikel →
Testautomatisering

Schilferige tests: wat de oorzaak ervan is en hoe u ze voorgoed kunt oplossen

Zwakke tests uitgelegd met demo's die we hebben uitgevoerd: de belangrijkste oorzaken, hoe je er een kunt bevestigen en diagnosticeren, goede oploss…

Lees artikel →
Softwaretesten

Belastingtesten versus stresstesten: verschillen, statistieken en k6-voorbeelden

Belastingtesten versus stresstesten uitgelegd: wat elk bewijst, piek- en soak-tests, de statistieken die er toe doen, waarom gemiddelden misleiden, …

Lees artikel →
Softwaretesten

Testcase versus testscenario: belangrijkste verschillen, voorbeelden en wanneer deze te gebruiken

Testcase versus testscenario uitgelegd: duidelijke definities, een tabel naast elkaar, één functie voor het opnieuw instellen van wachtwoorden, over…

Lees artikel →
Databases & SQL

Optimalisatie van SQL-query's: lees uitvoeringsplannen en repareer langzame query's, met timing

Optimalisatie van SQL-query's getest op een miljoen rijen: lees uitvoeringsplannen, voeg de juiste indexen toe, repareer niet-sargeerbare filters, g…

Lees artikel →
Databases & SQL

SQL UNION versus UNION ALL: verschillen, voorbeelden en geteste prestaties

SQL UNION versus UNION ALL uitgelegd met de query's die we hebben uitgevoerd: duplicaten, de regels volgen beide, een echte databug, gemeten prestat…

Lees artikel →
Softwareontwikkeling

JavaScript Fetch API-tutorial: GET, POST, foutafhandeling en time-outs

Een JavaScript Fetch API-tutorial getest tegen een lokale server: GET en POST, waarom 404 niet gooit, een herbruikbare helper, queryreeksen, time-ou…

Lees artikel →
Softwareontwikkeling

Python-bestandsverwerking: lezen, schrijven, CSV, JSON en pathlib met voorbeelden

Het verwerken van Python-bestanden uitgelegd met code die we hebben uitgevoerd: open modi, met het lezen van grote bestanden, CSV, JSON, pathlib, bi…

Lees artikel →
Softwareontwikkeling

Git merge vs rebase: verschillen, voorbeelden en wanneer je wat gebruikt

Git merge vs rebase uitgelegd met echte logoutput, een vergelijkingstabel, de gouden regel van rebase en een veilige teamwerkwijze.

Lees artikel →
Softwareontwikkeling

Python list comprehension: syntaxis, voorbeelden en wanneer je het vermijdt

Python list comprehension uitgelegd: syntaxis, filteren, if-else, geneste lussen, gemeten tijden en wanneer een gewone for-lus beter is.

Lees artikel →
Databases & SQL

SQL JOIN uitgelegd met voorbeelden (Inner, Left, Right, Full)

Begrijp SQL joins stap voor stap met voorbeeldtabellen en queries: INNER, LEFT, RIGHT, FULL, CROSS en SELF, plus veelgemaakte fouten en prestatietips.

Lees artikel →