Een CSV-bestand (Comma-Separated Values) is een tekstbestand waarin gegevens worden georganiseerd in rijen en kolommen. Elke rij in het bestand is een record, en de waarden in elke rij worden gescheiden door een scheidingsteken (meestal een komma).
Voorbeeld CSV-bestand:
naam,leeftijd,land
Alice,30,Nederland
Bob,25,België
Charlie,35,Duitsland
Dit bestand bevat drie rijen (exclusief de header) en drie kolommen: naam
, leeftijd
, en land
.
csv
-moduleIn Python kun je CSV-bestanden gemakkelijk lezen met behulp van de ingebouwde csv
-module. Laten we beginnen met het lezen van een eenvoudig CSV-bestand.
Om een CSV-bestand te lezen, gebruik je de functie open()
om het bestand te openen en vervolgens gebruik je csv.reader()
om de inhoud van het bestand te verwerken.
import csv
with open("gegevens.csv", "r") as bestand:
reader = csv.reader(bestand)
for rij in reader:
print(rij)
In dit voorbeeld wordt het bestand gegevens.csv geopend en worden alle rijen in het bestand afgedrukt als lijsten van strings.
De csv.DictReader()
functie leest elke rij in een CSV-bestand als een dictionary, waarbij de kolomkoppen dienen als de sleutels van de dictionary.
import csv
with open("gegevens.csv", "r") as bestand:
reader = csv.DictReader(bestand)
for rij in reader:
print(rij)
Dit voorbeeld toont hoe je een CSV-bestand kunt lezen waarbij elke rij een dictionary wordt, met de kolomkoppen als sleutels.
Om CSV-gegevens op een gestructureerde manier te verwerken, kunnen we classes gebruiken om elke rij in een CSV-bestand om te zetten in een object. Dit maakt de gegevens overzichtelijker en gemakkelijker te beheren.
We kunnen de hele rij rechtstreeks doorgeven aan de constructor van de class, waarna de velden binnen de __init__()
-methode worden toegewezen.
Laten we beginnen met het maken van een class Persoon, waarbij elke rij in het CSV-bestand wordt doorgegeven aan de constructor en de gegevens worden toegewezen aan de velden binnen de __init__()
-methode.
Voorbeeld Class:
class Persoon:
def __init__(self, rij):
self.naam = rij["naam"]
self.leeftijd = int(rij["leeftijd"])
self.land = rij["land"]
def __repr__(self):
return f"Persoon({self.naam}, {self.leeftijd}, {self.land})"
In dit voorbeeld wordt de hele rij (als dictionary) doorgegeven aan de __init__()
-methode. De velden van de rij, zoals naam
, leeftijd
, en land
, worden direct toegewezen aan de attributen van de class.
Nu we een class hebben gedefinieerd, kunnen we de gegevens uit een CSV-bestand omzetten in objecten van de class Persoon. We zullen de DictReader
gebruiken om elke rij als een dictionary te lezen en deze vervolgens door te geven aan de __init__()
-methode van de class.
import csv
class Persoon:
def __init__(self, rij):
self.naam = rij["naam"]
self.leeftijd = int(rij["leeftijd"])
self.land = rij["land"]
def __repr__(self):
return f"Persoon({self.naam}, {self.leeftijd}, {self.land})"
# Lees het CSV-bestand en maak voor elke rij een Persoon-object
personen = []
with open("gegevens.csv", "r") as bestand:
reader = csv.DictReader(bestand)
for rij in reader:
persoon = Persoon(rij) # Rij als dictionary doorgeven aan de constructor
personen.append(persoon)
# Druk de lijst van Persoon-objecten af
for persoon in personen:
print(persoon)
Output:
Persoon(Alice, 30, Nederland)
Persoon(Bob, 25, België)
Persoon(Charlie, 35, Duitsland)
In dit voorbeeld wordt elke rij van het CSV-bestand omgezet naar een object van de class Persoon. De gehele rij (als dictionary) wordt doorgegeven aan de constructor van de class, en de gegevens worden toegewezen binnen de __init__()
-methode.
Het gebruik van classes bij het verwerken van CSV-bestanden biedt enkele belangrijke voordelen:
Structuur: In plaats van met lijsten of dictionaries te werken, bundel je de gegevens van elke rij in een object. Dit zorgt voor meer structuur in je programma.
Leesbaarheid: Door gebruik te maken van objecten met duidelijke attributen (persoon.naam
in plaats van rij["naam"]
), wordt je code beter leesbaar.
Herbruikbaarheid: De class kan eenvoudig worden uitgebreid met nieuwe functionaliteiten, zoals methoden om de gegevens te manipuleren of te berekenen. Dit maakt de code flexibeler en beter herbruikbaar.
Foutafhandeling: Je kunt gemakkelijk validaties of foutafhandeling implementeren in de class. Bijvoorbeeld, als een rij ontbrekende gegevens bevat, kun je dat binnen de constructor van de class afhandelen.
Scheidingstekens: Standaard worden komma’s gebruikt als scheidingsteken in CSV-bestanden, maar sommige bestanden gebruiken andere tekens, zoals een puntkomma of een tab. Je kunt dit aanpassen met het argument delimiter
in de csv.reader()
of csv.DictReader()
.
Voorbeeld:
reader = csv.reader(bestand, delimiter=';')
Omgaan met lege waarden: Sommige CSV-bestanden bevatten lege waarden in bepaalde velden. Je kunt in de __init__()
-methode van je class controleren of een veld leeg is, en indien nodig een standaardwaarde toekennen.
Voorbeeld:
class Persoon:
def __init__(self, rij):
self.naam = rij["naam"] if rij["naam"] else "Onbekend"
self.leeftijd = int(rij["leeftijd"]) if rij["leeftijd"] else 0
self.land = rij["land"] if rij["land"] else "Onbekend"
Encodering: Soms kunnen CSV-bestanden speciale karakters bevatten die problemen veroorzaken bij het lezen. In dat geval kun je de optie encoding
gebruiken bij het openen van het bestand.
Voorbeeld:
with open("gegevens.csv", "r", encoding="utf-8") as bestand:
reader = csv.DictReader(bestand)
Headers: Vaak bevat de eerste rij geen data, maar headers. Die wil je niet in je dataset. Je kan een rij overslaan met de functie next()
.
Voorbeeld:
import csv
with open("gegevens.csv", "r") as bestand:
reader = csv.reader(bestand)
header = next(reader) # Lees de eerste rij (header)
print("Header:", header)
for rij in reader:
print("Gegevens:", rij)
In deze oefeningen gebruiken we het bestand weather.csv.
Dit zijn de headers in het bestand.
MinTemp,MaxTemp,Rainfall,Evaporation,Sunshine,WindGustDir,WindGustSpeed,WindDir9am,WindDir3pm,WindSpeed9am,WindSpeed3pm,Humidity9am,Humidity3pm,Pressure9am,Pressure3pm,Cloud9am,Cloud3pm,Temp9am,Temp3pm,RainToday,RISK_MM,RainTomorrow
Instructies:
Instructies:
Instructies:
Instructies:
Instructies: