CSV (Comma-Separated Values) er et enkelt tekstformat der data er organisert i rader og kolonner, litt som et regneark.
Første rad er ofte overskrifter (kolonnenavn), og de neste radene er dataverdier.
navn,fag,karakter,termin
Amelia Hansen,Matematikk,5,1
Benjamin Larsen,Norsk,4,1
Celine Olsen,IT2,6,1
Merk: Selv om formatet heter “comma-separated”, brukes noen ganger semikolon (;) som skilletegn i norske filer.
Python har et innebygd bibliotek som heter csv. Derfra kan vi bruke csv.DictReader for å lese CSV-filer som lister med ordbøker, der nøklene er kolonnenavnene.
import csv
withopen("karakterer.csv",encoding="utf-8") as fil:
Et vanlig mønster i databehandling er å telle antall forekomster.
For eksempel hvor mange elever som har fått hver karakter, eller hvor mange representanter hvert parti har.
For å få til dette kan vi bruke en ordbok der nøkkelen er kategorien og verdien er antallet.
import csv
withopen("karakterer.csv",encoding="utf-8") as fil:
leser = csv.DictReader(fil)
karakterer =list(leser)
antall_per_karakter = {}
for rad in karakterer:
karakter = rad["karakter"]
if karakter notin antall_per_karakter:
antall_per_karakter[karakter] =1
else:
antall_per_karakter[karakter] +=1
print(antall_per_karakter)
# {'5': 8, '4': 6, '6': 10, '3': 4, '2': 2}
Mønsteret er alltid det samme:
Lag en tom ordbok
Gå gjennom listen med en for-løkke
Hvis nøkkelen ikke finnes: legg den til med verdien 1
lambda par: par[1] betyr “sorter etter det andre elementet i hvert par”, altså antallet.
reverse=True gir synkende rekkefølge, altså høyest antall øverst.
I Python er kodene for å lese inn CSV- og JSON-filer litt forskjellig.
CSV-filer krever at vi bruker CSV-modulen og ofte csv.DictReader, mens for JSON-filer bruker vi ofte json.load fra JSON-modulen.
Nå som vi har lært litt om objektorientert programmering, kan vi lage egne klasser for å forenkle innlesingen.
Da slipper vi huske på de forskjellige modulene og funksjonene/klassene som følger med de.
I denne delen lager vi to klasser CSVfil og JSONfil som begge arver fra samme superklasse.
Målet med denne koden er å forenkle innlesing av filer ved å gjøre det så likt som mulig uavhengig av filtype.
classDiagram
class Fil {
+filsti: str
+data: list
+les_fil()
+kolonne(nøkkel) list
+filtrer(nøkkel, verdi) list
+filtrer_og_hent_kolonne(nøkkel, verdi, kolonne) list
+gjennomsnitt(nøkkel) float
+sorter(nøkkel, synkende)
}
class CSVfil {
+les_fil() list
}
class JSONfil {
+les_fil() list
}
Fil <|-- CSVfil
Fil <|-- JSONfil
Klassene CSVfil og JSONfil har de samme metodene:
Metode
Beskrivelse
.kolonne(nøkkel)
Returnerer en liste med alle verdier i en kolonne
.filtrer(nøkkel, verdi)
Returnerer rader der rad[nøkkel] == verdi
.filtrer_og_hent_kolonne(nøkkel, verdi, kolonne)
Filtrerer og returnerer kun verdier fra én kolonne
.gjennomsnitt(nøkkel)
Regner ut gjennomsnittet av en tallkolonne
.sorter(nøkkel, synkende)
Sorterer dataen på plass etter en kolonne
Tips: Bruk disse klassene når du løser oppgaver og legg til nye metoder i din egen kode når du kommer bort i noe som klassene ikke kan løse enda.
OBS:.sorter() endrer self.data permanent – den opprinnelige rekkefølgen er borte etter at metoden er kalt. Vil du beholde originalen, kan du lage en ny metode sortert() som returnerer en ny sortert liste i stedet for å endre self.data: