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

Filhandtering og databehandling

I teknologi og forskingslære jobbar vi ofte med data som er lagra i filer – til dømes temperaturmålingar frå ein sensor, trafikkdata frå ein kommune, eller kjemiske analyseresultat. For å kunne analysere slike data med programmering, må vi kunne lese data frå filer og skrive resultat tilbake.

I dette kapittelet lærer du å:
- Opne, lese og skrive tekstfiler med Python
- Lese og behandle data i CSV-format (kommaseparerte verdiar)
- Bruke with-setninga for trygg filhandtering
- Gjere enkel databehandling som filtrering, utrekning og oppsummering

Filhandtering er ei sentral ferdigheit i all programmering – frå å lese inndata frå sensorar til å generere rapportar og eksportere resultat.

Opne filer med open()

Funksjonen open() opnar ei fil i Python. Han tek to hovudargument: filnamnet og modusen (kva du vil gjere med fila).

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 modusar:

ModusTydingSkildring
"r"ReadLes fila (standard)
"w"WriteSkriv til fila – slettar eksisterande innhald
"a"AppendLegg til på slutten av fila

Best practice: Bruk alltid with-setninga for å opne filer. Då blir fila lukka automatisk når du er ferdig, sjølv om det oppstår ein feil:
with open("data.txt", "r") as fil:
    innhold = fil.read()
    print(innhold)
# Filen lukkes automatisk her

Ulike måtar å lese filer på

Python gir deg fleire metodar for å lese innhaldet i ei 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() fjernar mellomrom og linjeskift (\n) i starten og slutten av ein streng. Dette er viktig fordi kvar linje i ei fil vanlegvis endar med eit linjeskift-teikn.

Metode 3 er tilrådd for store filer, fordi han berre les éi linje om gongen i staden for å laste heile fila inn i minnet.

✏️Lese målingar frå ei tekstfil

Tenk deg at vi har ei fil temperaturer.txt med éin temperaturverdi per linje:

18.3
21.7
19.5
23.1
17.8
22.0

Vi kan lese desse verdiane og rekne ut 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 brukar float(linje.strip()) for å konvertere kvar linje frå tekst til desimaltal. Utan strip() ville linjeskift-teiknet forårsaka ein feil.

📝Oppgave 1

Kva gjer modusen "a" når du opnar ei fil med open("logg.txt", "a")?

Skrive til filer

For å lagre resultat brukar 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 leggje til linjeskift (\n) manuelt, medan print() legg det til automatisk.

Du kan òg skrive mange linjer på éin gong 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 leggje til data i ei eksisterande fil utan å slette det som allereie er der – til dømes for å logge sensordata over tid.

✏️Lagre analyseresultat i ei fil

Lat oss lese temperaturar frå ei fil, analysere dei, og skrive ein rapport til ei 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 ein typisk arbeidsflyt: les data → analyser → skriv resultat. Dette mønsteret blir brukt i nesten all databehandling.

📝Oppgave 2

Kva skjer dersom du køyrer følgjande kode to gonger etter kvarandre?

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

CSV – kommaseparerte verdiar
CSV (Comma-Separated Values) er eit enkelt og mykje brukt filformat for tabelldata. Kvar linje representerer ei rad, og verdiane i rada er skilde med komma (eller semikolon i norske filer).

Døme på ei 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 ei overskriftsrad (header) som skildrar kolonnane.

Python har ein 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 verdiar i ei CSV-fil blir lesne som strengar. Du må konvertere til rett datatype (f.eks. float() for desimaltal).

Behandle CSV-data

Når du les ei CSV-fil, er det vanleg å samle dataa i lister for vidare 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 òg 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="" hindrar tomme linjer mellom radene på Windows.

✏️Analysere vêrdata frå CSV

Her er eit komplett program som les vêrdata frå ei CSV-fil og lagar ei 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 heile flyten: lese CSV, sortere data i separate lister, rekne ut statistikk med innebygde funksjonar og list comprehension, og presentere resultata i ein ryddig rapport.

📝Oppgave 3

Skriv eit Python-program som les ei tekstfil med namn tall.txt der kvar linje inneheld eitt heiltal. Programmet skal skrive ut summen av alle tala, gjennomsnittet og det største talet.

Oppsummering

I dette kapittelet har du lært å:

- Opne filer med open() i modusane "r" (les), "w" (skriv) og "a" (legg til)
- Bruke with-setninga for trygg filhandtering der fila blir lukka automatisk
- Lese filer med read(), readlines() eller linje for linje i ei 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, rekne ut statistikk og filtrere

Viktige prinsipp:
- Bruk alltid with for å handtere filer – det er tryggare og ryddigare
- Hugs at CSV-verdiar blir lesne som strengar – konverter med int() eller float()
- Modusane "w" og "a" har ulik åtferd: "w" overskriv, "a" legg til

Filhandtering og databehandling er kjernen i mykje av det vi gjer i teknologi og forskingslære – frå å lese sensordata til å analysere forsøksresultat.

📝Oppgave 4

Skriv eit program som les ei CSV-fil elever.csv med kolonnane navn,norsk,matte,engelsk. Programmet skal: a) Rekne ut gjennomsnittskarakteren for kvar elev. b) Skrive ut ein tabell med namn og gjennomsnitt. c) Finne eleven med høgast gjennomsnitt.

📝Oppgave 5

Skriv eit program som fungerer som ein enkel datalogger. Programmet skal: a) Be brukaren skrive inn temperaturmålingar (avslutt med «ferdig»). b) Lagre alle målingane i ei fil malinger.txt med tidsstempel. c) Rekne ut og vise statistikk (tal, gjennomsnitt, min, maks). d) Lagre statistikken i ei eiga 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.