C/C++ for Arduino, setup(), loop() og biblioteker.
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.
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:
| Modus | Betydning | Beskrivelse |
|---|---|---|
"r" | Read | Leser filen (standard) |
"w" | Write | Skriver til filen – sletter eksisterende innhold |
"a" | Append | Legger 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 herUlike 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.
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.0Vi 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 °CLegg 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.
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.
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.
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")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.9Fø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 strengerViktig: 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.
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.
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.
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.
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.