Tilbake
5.5
Arduino-programmering

5.5 Arduino-programmering

C/C++ for Arduino, setup(), loop() og biblioteker.

35 min
5 oppgaver
Arduino-kodesetup()loop()Biblioteker
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 5 oppgaver

Filhåndtering og databehandling

I teknologi og forskningslære jobber vi ofte med data som er lagret i filer – for eksempel temperaturmålinger fra en sensor, trafikkdata fra en kommune, eller kjemiske analyseresultater. For å kunne analysere slike data med programmering, må vi kunne lese data fra filer og skrive resultater tilbake.

I dette kapittelet lærer du å:
- Åpne, lese og skrive tekstfiler med Python
- Lese og behandle data i CSV-format (kommaseparerte verdier)
- Bruke with-setningen for sikker filhåndtering
- Gjøre enkel databehandling som filtrering, beregning og oppsummering

Filhåndtering er en sentral ferdighet i all programmering – fra å lese inndata fra sensorer til å generere rapporter og eksportere resultater.

Åpne filer med open()

Funksjonen open() åpner en fil i Python. Den tar to hovedargumenter: filnavnet og modusen (hva du vil gjøre med filen).

fil = open("data.txt", "r")   # Åpne for lesing (read)
fil = open("resultat.txt", "w")  # Åpne for skriving (write) – overskriver!
fil = open("logg.txt", "a")   # Åpne for tillegg (append)

Viktige moduser:

ModusBetydningBeskrivelse
"r"ReadLeser filen (standard)
"w"WriteSkriver til filen – sletter eksisterende innhold
"a"AppendLegger til på slutten av filen

Best practice: Bruk alltid with-setningen for å åpne filer. Da lukkes filen automatisk når du er ferdig, selv om det oppstår en feil:
with open("data.txt", "r") as fil:
    innhold = fil.read()
    print(innhold)
# Filen lukkes automatisk her

Ulike måter å lese filer på

Python gir deg flere metoder for å lese innholdet i en fil:

# Metode 1: Les hele filen som én streng
with open("data.txt", "r") as fil:
    alt = fil.read()
    print(alt)

# Metode 2: Les alle linjer som en liste
with open("data.txt", "r") as fil:
    linjer = fil.readlines()
    for linje in linjer:
        print(linje.strip())   # strip() fjerner linjeskift

# Metode 3: Les linje for linje (mest minneeffektivt)
with open("data.txt", "r") as fil:
    for linje in fil:
        print(linje.strip())

strip() fjerner mellomrom og linjeskift (\n) i starten og slutten av en streng. Dette er viktig fordi hver linje i en fil vanligvis ender med et linjeskift-tegn.

Metode 3 er anbefalt for store filer, fordi den bare leser én linje om gangen i stedet for å laste hele filen inn i minnet.

✏️Lese målinger fra en tekstfil

Tenk deg at vi har en fil temperaturer.txt med én temperaturverdi per linje:

18.3
21.7
19.5
23.1
17.8
22.0

Vi kan lese disse verdiene og beregne gjennomsnittet:

temperaturer = []

with open("temperaturer.txt", "r") as fil:
    for linje in fil:
        verdi = float(linje.strip())
        temperaturer.append(verdi)

antall = len(temperaturer)
gjennomsnitt = sum(temperaturer) / antall

print(f"Antall målinger: {antall}")
print(f"Gjennomsnitt: {gjennomsnitt:.1f} °C")
print(f"Høyeste: {max(temperaturer):.1f} °C")
print(f"Laveste: {min(temperaturer):.1f} °C")

Utskrift:

Antall målinger: 6
Gjennomsnitt: 20.4 °C
Høyeste: 23.1 °C
Laveste: 17.8 °C

Legg merke til at vi bruker float(linje.strip()) for å konvertere hver linje fra tekst til desimaltall. Uten strip() ville linjeskift-tegnet forårsaket en feil.

📝Oppgave 1

Hva gjør modusen "a" når du åpner en fil med open("logg.txt", "a")?

Skrive til filer

For å lagre resultater bruker vi write() eller print() med file-parameteren:

# Metode 1: write() – skriver en streng
with open("resultat.txt", "w") as fil:
    fil.write("Temperaturrapport\n")
    fil.write("=================\n")
    fil.write(f"Gjennomsnitt: {20.4:.1f} °C\n")

# Metode 2: print() med file-parameter
with open("resultat.txt", "w") as fil:
    print("Temperaturrapport", file=fil)
    print("=================", file=fil)
    print(f"Gjennomsnitt: {20.4:.1f} °C", file=fil)

Merk: Med write() må du legge til linjeskift (\n) manuelt, mens print() legger det til automatisk.

Du kan også skrive mange linjer på én gang med writelines():

linjer = ["Linje 1\n", "Linje 2\n", "Linje 3\n"]
with open("output.txt", "w") as fil:
    fil.writelines(linjer)

Tips: Bruk "a"-modus (append) når du vil legge til data i en eksisterende fil uten å slette det som allerede er der – for eksempel for å logge sensordata over tid.

✏️Lagre analyseresultater i en fil

La oss lese temperaturer fra en fil, analysere dem, og skrive en rapport til en ny fil:

# Les data
temperaturer = []
with open("temperaturer.txt", "r") as fil:
    for linje in fil:
        temperaturer.append(float(linje.strip()))

# Analyser
gjennomsnitt = sum(temperaturer) / len(temperaturer)
frost = [t for t in temperaturer if t < 0]

# Skriv rapport
with open("rapport.txt", "w") as fil:
    print("TEMPERATURRAPPORT", file=fil)
    print("=" * 30, file=fil)
    print(f"Antall målinger:  {len(temperaturer)}", file=fil)
    print(f"Gjennomsnitt:     {gjennomsnitt:.1f} °C", file=fil)
    print(f"Høyeste:          {max(temperaturer):.1f} °C", file=fil)
    print(f"Laveste:          {min(temperaturer):.1f} °C", file=fil)
    print(f"Frostdager:       {len(frost)}", file=fil)

print("Rapport skrevet til rapport.txt")

Programmet viser en typisk arbeidsflyt: les data → analyser → skriv resultater. Dette mønsteret brukes i nesten all databehandling.

📝Oppgave 2

Hva skjer hvis du kjører følgende kode to ganger etter hverandre?

with open("logg.txt", "w") as fil:
    fil.write("Måling 1\n")

CSV – kommaseparerte verdier
CSV (Comma-Separated Values) er et enkelt og mye brukt filformat for tabelldata. Hver linje representerer en rad, og verdiene i raden er separert med komma (eller semikolon i norske filer).

Eksempel på en CSV-fil (vær.csv):

dato,temperatur,nedbor,vind
2024-01-15,3.2,0.0,4.5
2024-01-16,-1.8,2.3,7.1
2024-01-17,0.5,0.0,3.2
2024-01-18,-3.1,5.7,8.9

Første linje er ofte en overskriftsrad (header) som beskriver kolonnene.

Python har en innebygd csv-modul for å lese og skrive CSV-filer:

import csv

with open("vær.csv", "r") as fil:
    leser = csv.reader(fil)
    overskrift = next(leser)    # Les første linje (header)
    for rad in leser:
        print(rad)              # Hver rad er en liste med strenger

Viktig: Alle verdier i en CSV-fil leses som strenger. Du må konvertere til riktig datatype (f.eks. float() for desimaltall).

Behandle CSV-data

Når du leser en CSV-fil, er det vanlig å samle dataene i lister for videre analyse:

import csv

datoer = []
temperaturer = []
nedbor = []

with open("vær.csv", "r") as fil:
    leser = csv.reader(fil)
    next(leser)   # Hopp over overskriften
    for rad in leser:
        datoer.append(rad[0])
        temperaturer.append(float(rad[1]))
        nedbor.append(float(rad[2]))

# Nå kan vi analysere dataene
print(f"Antall dager: {len(datoer)}")
print(f"Snitttemperatur: {sum(temperaturer) / len(temperaturer):.1f} °C")
print(f"Total nedbør: {sum(nedbor):.1f} mm")

Du kan også skrive CSV-filer:

import csv

data = [
    ["Stoff", "Masse (g)", "Volum (mL)"],
    ["Vann", 100.0, 100.0],
    ["Etanol", 78.9, 100.0],
    ["Kvikksølv", 1360.0, 100.0],
]

with open("tetthet.csv", "w", newline="") as fil:
    skriver = csv.writer(fil)
    skriver.writerows(data)

Parameteren newline="" forhindrer tomme linjer mellom radene på Windows.

✏️Analysere værdata fra CSV

Her er et komplett program som leser værdata fra en CSV-fil og lager en oppsummering:

import csv

# Les data fra CSV-filen
datoer = []
temperaturer = []
nedbor = []

with open("vær.csv", "r") as fil:
    leser = csv.reader(fil)
    next(leser)   # Hopp over overskrift
    for rad in leser:
        datoer.append(rad[0])
        temperaturer.append(float(rad[1]))
        nedbor.append(float(rad[2]))

# Beregn statistikk
snitt_temp = sum(temperaturer) / len(temperaturer)
total_nedbor = sum(nedbor)
frostdager = [d for d, t in zip(datoer, temperaturer) if t < 0]
torrdag = sum(1 for n in nedbor if n == 0)

# Skriv ut rapport
print("VÆRRAPPORT")
print("=" * 40)
print(f"Periode: {datoer[0]} til {datoer[-1]}")
print(f"Antall dager: {len(datoer)}")
print(f"Snitttemperatur:  {snitt_temp:6.1f} °C")
print(f"Høyeste temp.:    {max(temperaturer):6.1f} °C")
print(f"Laveste temp.:    {min(temperaturer):6.1f} °C")
print(f"Total nedbør:     {total_nedbor:6.1f} mm")
print(f"Tørre dager:      {torrdag:6d}")
print(f"Frostdager:       {len(frostdager):6d}")

Programmet viser hele flyten: lese CSV, sortere data i separate lister, beregne statistikk med innebygde funksjoner og list comprehension, og presentere resultatene i en ryddig rapport.

📝Oppgave 3

Skriv et Python-program som leser en tekstfil med navn tall.txt der hver linje inneholder ett heltall. Programmet skal skrive ut summen av alle tallene, gjennomsnittet og det største tallet.

Oppsummering

I dette kapittelet har du lært å:

- Åpne filer med open() i modusene "r" (les), "w" (skriv) og "a" (legg til)
- Bruke with-setningen for sikker filhåndtering der filen lukkes automatisk
- Lese filer med read(), readlines() eller linje for linje i en for-løkke
- Skrive til filer med write() og print(file=...)
- Lese og skrive CSV-filer med csv.reader() og csv.writer()
- Utføre enkel databehandling: samle data i lister, beregne statistikk og filtrere

Viktige prinsipper:
- Bruk alltid with for å håndtere filer – det er tryggere og ryddigere
- Husk at CSV-verdier leses som strenger – konverter med int() eller float()
- Modusene "w" og "a" har forskjellig oppførsel: "w" overskriver, "a" legger til

Filhåndtering og databehandling er kjernen i mye av det vi gjør i teknologi og forskningslære – fra å lese sensordata til å analysere forsøksresultater.

📝Oppgave 4

Skriv et program som leser en CSV-fil elever.csv med kolonnene navn,norsk,matte,engelsk. Programmet skal: a) Beregne gjennomsnittskarakteren for hver elev. b) Skrive ut en tabell med navn og gjennomsnitt. c) Finne eleven med høyest gjennomsnitt.

📝Oppgave 5

Skriv et program som fungerer som en enkel datalogger. Programmet skal: a) Be brukeren skrive inn temperaturmålinger (avslutt med «ferdig»). b) Lagre alle målingene i en fil malinger.txt med tidsstempel. c) Beregne og vise statistikk (antall, gjennomsnitt, min, maks). d) Lagre statistikken i en egen fil statistikk.txt.

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.