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.
- Open bestanden altijd met een
withblok, 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 aanpathlibvoor 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
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.
Meer handleidingen over testen, AI en moderne ontwikkeling
Genoten van dit artikel? Kies een onderwerp en ga direct naar onze nieuwste tutorials.
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 →DevOpsOmgevingsvariabelen 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 →SoftwareontwikkelingAPI-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 →TestautomatiseringSpotten 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 →SoftwaretestenCodedekking 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 & SQLDELETE 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 & SQLSQL-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 →SoftwareontwikkelingTypeScript-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 →SoftwareontwikkelingPython *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 →SoftwareontwikkelingPython 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 intelligentieWat 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 →DevOpsMonitoring 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 →DevOpsDocker-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 →TestautomatiseringTDD 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 →SoftwaretestenGebruikersacceptatietesten (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 & SQLSQL 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 & SQLSQL 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 →SoftwareontwikkelingWat 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 →SoftwareontwikkelingJavaScript-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 →SoftwareontwikkelingPython-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 intelligentieWat 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 →DevOpsImplementatie 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 →TestautomatiseringSchilferige 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 →SoftwaretestenBelastingtesten 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 →SoftwaretestenTestcase 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 & SQLOptimalisatie 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 & SQLSQL 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 →SoftwareontwikkelingJavaScript 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 →SoftwareontwikkelingPython-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 →SoftwareontwikkelingPython-klassen en -objecten: OOP-zelfstudie met echte voorbeelden
Python-klassen en -objecten uitgelegd met code die we hebben uitgevoerd: __init__, methoden, klasse versus instantie-attributen, overerving, eigensc…
Lees artikel →Kunstmatige intelligentieWat is een groot taalmodel? Hoe LLM's werken, uitgelegd zonder de hype
Wat is een groot taalmodel? LLM's uitgelegd in duidelijke taal: tokens, inbedding, aandacht, training, temperatuur- en contextvensters, een kleine d…
Lees artikel →DevOpsLinux-opdrachten voor beginners: de essentiële terminalgids met voorbeelden
Linux-opdrachten voor beginners, gegroepeerd op taak: navigatie, bestanden, logboeken bekijken, grep, pipelines, machtigingen, processen en archieve…
Lees artikel →TestautomatiseringSelenium versus toneelschrijver: belangrijkste verschillen, code vergeleken en welke te kiezen
Selenium versus Playwright vergeleken: architectuur, wachten, browser- en taalondersteuning, debuggen, dezelfde test in beide tools, migratieadvies …
Lees artikel →SoftwaretestenEquivalentiepartitionering: testontwerptechniek uitgelegd met uitgewerkte voorbeelden
Equivalentiepartitionering uitgelegd: hoe je geldige en ongeldige partities kunt vinden, uitgewerkte voorbeelden voor leeftijden, wachtwoorden en ko…
Lees artikel →SoftwaretestenErnst versus prioriteit bij het testen van software: verschillen, matrix en echte voorbeelden
Ernst versus prioriteit bij het testen van software uitgelegd: duidelijke definities, een vierwegmatrix met voorbeelden, niveauschalen, wie deze bep…
Lees artikel →Databases & SQLTutorial voor SQL-subquery's: typen, gecorreleerde subquery's en BESTAAN met voorbeelden
Een SQL-subquery-tutorial met query's die we hebben uitgevoerd: scalaire, IN-, FROM- en SELECT-subquery's, gecorreleerde subquery's, EXISTS, de NOT …
Lees artikel →Databases & SQLSQL-transacties en ACID uitgelegd: COMMIT-, ROLLBACK- en isolatieniveaus
SQL-transacties en ACID uitgelegd met een bankoverschrijving die we hebben uitgevoerd: COMMIT, ROLLBACK, savepoints, locks, isolatieniveaus, dirty r…
Lees artikel →SoftwareontwikkelingGit 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 →SoftwareontwikkelingPython 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 & SQLSQL 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 →