.CSV Files

Wat is een CSV-bestand?

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.


1. CSV-bestanden lezen met de csv-module

In 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.

1.1 Het openen van een 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.

Voorbeeld:

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.


1.2 CSV-bestanden als dictionaries lezen

De csv.DictReader() functie leest elke rij in een CSV-bestand als een dictionary, waarbij de kolomkoppen dienen als de sleutels van de dictionary.

Voorbeeld:

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.


2. CSV-gegevens verwerken met classes

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.

2.1 Een class voor elk record

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.


2.2 CSV-rijen omzetten naar objecten

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.

Voorbeeld:

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.


2.3 Voordelen van het gebruik van classes bij CSV-verwerking

Het gebruik van classes bij het verwerken van CSV-bestanden biedt enkele belangrijke voordelen:

  1. 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.

  2. Leesbaarheid: Door gebruik te maken van objecten met duidelijke attributen (persoon.naam in plaats van rij["naam"]), wordt je code beter leesbaar.

  3. 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.

  4. 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.


3. Aanvullende tips voor het werken met CSV-bestanden

  • 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)
    
    

Oefeningen

In deze oefeningen gebruiken we het bestand weather.csv.

Dit zijn de headers in het bestand.

CSV-headers:

MinTemp,MaxTemp,Rainfall,Evaporation,Sunshine,WindGustDir,WindGustSpeed,WindDir9am,WindDir3pm,WindSpeed9am,WindSpeed3pm,Humidity9am,Humidity3pm,Pressure9am,Pressure3pm,Cloud9am,Cloud3pm,Temp9am,Temp3pm,RainToday,RISK_MM,RainTomorrow

Oefening 1: Gemiddelde en maximale temperatuur berekenen

Instructies:

  • Schrijf een class WeerData die de gegevens van elke rij in de CSV bundelt.
  • Gebruik Numpy om het gemiddelde en de maximale waarde van de kolommen MinTemp en MaxTemp te berekenen.
  • Visualiseer deze gegevens met behulp van Matplotlib door een staafdiagram te maken van de gemiddelde minimum- en maximumtemperaturen.

Oefening 2: Lijnplot van Windsnelheden om 9 uur en 15 uur

Instructies:

  • Gebruik de class WeerData om de gegevens van de kolommen WindSpeed9am en WindSpeed3pm te lezen.
  • Kijk uit! Sommige velden bevatten de waarde NA. Hoe ga je daar mee om?
  • Gebruik Matplotlib om een lijnplot te maken van de windsnelheden om 9 uur en 15 uur over de tijd (de rijen in de dataset).

Oefening 3: Correlatie tussen temperatuur en neerslag

Instructies:

  • Gebruik de class WeerData om de gegevens van de kolommen MaxTemp en Rainfall te lezen.
  • Bereken de correlatie tussen de maximumtemperatuur en de hoeveelheid neerslag met Numpy.corrcoef().
  • Maak een scatter plot om de relatie tussen deze twee variabelen te visualiseren.

Oefening 4: Boxplot van de luchtdruk om 9 uur en 15 uur

Instructies:

  • Gebruik de class WeerData om de luchtdrukwaarden van de kolommen Pressure9am en Pressure3pm te lezen.
  • Gebruik Matplotlib om een boxplot te maken van de luchtdrukwaarden om 9 uur en 15 uur om de spreiding van de luchtdruk over de tijd te visualiseren.

Oefening 5: Histogram van neerslaghoeveelheden

Instructies:

  • Gebruik de class WeerData om de gegevens van de kolom Rainfall te lezen.
  • Maak een histogram van de neerslaghoeveelheden om de verdeling van neerslag over de tijd te visualiseren.

Previous section:
Navigatie