Filer#

Vi kan både lese og skrive filer i Python.

Skrive til en fil ✍️#

Vi kan skrive en fil på følgende måte

with open("atomer.txt", "w") as file:
    file.write("Hydrogen,H,[1],Gass \n")
    file.write("Helium,He,[2],Gass \n")
    file.write("Litium,Li,[2 1],Fast \n")

Kjører vi programmet over så får vi filen atomer.txt i samme mappe som vi jobber i:

Hydrogen,H,[1],Gass
Helium,He,[2],Gass
Litium,Li,[2 1],Gass

\n betyr linjeskifte. Skriver vi ikke \n så får vi alt skrevet på samme linje.

Vi kan også skrive filer ved å bruke for-løkker.

with open("løkke.txt", "w") as file:
    for i in range(3):
        file.writeline("Linje " + str(i) + "\n")

Da får vi filen løkke.txt:

Linje 0
Linje 1
Linje 2

Merk deg

Når vi skriver ting med innrykk etter with open("løkke.txt", "w") as file: så er filen åpen. Det er bare i dette området man har tilgang til file. Når man går ut fra innrykkene, så lukkes filen.

Det finnes også andre måter å åpne og lukke filer.

Legge til på en fil 📝#

Tegnet "w" i with open("atomer.txt", "w") as file: står for write. Når vi bruker "w" skriver vi en fil helt fra starten av. Alt som stod der før vil bli slettet.

Hvis vi ønsker å legge til tekst på en allerede eksisterende fil kan vi bruke "a". Dette står for append, som betyr å legge til på slutten av.

with open("atomer.txt", "a") as file:
    file.write("Sølv,Ag,[2,8,18,18,1],Fast")

Hvis vi kjører dette programmet ser vi at filen atomer.txt blir til:

Hydrogen,H,[1],Gass 
Helium,He,[2],Gass 
Litium,Li,[2,1],Fast 
S�lv,Ag,[2 8 18 18 1],Fast

Sånn kan man legge til data på en allerede eksisterende fil!

… men hvorfor blir ordet Sølv skrevet som S�lv?

Håndtere æ, ø og å#

De nordiske bokstavene skaper noen gang problemer når vi leser og skriver filer.

Hvis vi legger til encoding = "utf-8" til som argument for open()-funksjonen så velges riktig sett med tegn.

with open("atomer.txt", "w", encoding = "utf-8") as file:
    file.write("Hydrogen,H,[1],Gass \n")
    file.write("Helium,He,[2],Gass \n")
    file.write("Litium,Li,[2 1],Fast \n")
    file.write("Sølv,Ag,[2 8 18 18 1],Fast")

Da får vi skrevet filen:

Hydrogen,H,[1],Gass 
Helium,He,[2],Gass 
Litium,Li,[2 1],Fast 
Sølv,Ag,[2 8 18 18 1],Fast

Lese fra fil 📖#

Vi kan lese fra en fil på følgende måte

with open("atomer.txt", "r", encoding = "utf-8") as file:
    linjer = file.readlines() # Alle linjene lagres i listen "linjer"

print(linjer) # Skriver ut linjene som en liste
['Atomnr,Navn,Symbol,Elektronkonfigurasjon,Tilstand_ved_romtemperatur\n', '1,Hydrogen,H,[1],Gass\n', '2,Helium,He,[2],Gass\n', '3,Litium,Li,[2 1],Fast\n', '4,Beryllium,Be,[2 2],Fast\n', '5,Bor,B,[2 3],Fast\n', '6,Karbon,C,[2 4],Fast\n', '7,Nitrogen,N,[2 5],Gass\n', '8,Oksygen,O,[2 6],Gass\n', '9,Fluor,F,[2 7],Gass\n', '10,Neon,Ne,[2 8],Gass\n', '11,Natrium,Na,[2 8 1],Fast\n', '12,Magnesium,Mg,[2 8 2],Fast\n', '13,Aluminium,Al,[2 8 3],Fast\n', '14,Silisium,Si,[2 8 4],Fast\n', '15,Fosfor,P,[2 8 5],Fast\n', '16,Svovel,S,[2 8 6],Fast\n', '17,Klor,Cl,[2 8 7],Gass\n', '18,Argon,Ar,[2 8 8],Gass\n', '19,Kalium,K,[2 8 8 1],Fast\n', '20,Kalsium,Ca,[2 8 8 2],Fast\n', '21,Scandium,Sc,[2 8 9 2],Fast\n', '22,Titan,Ti,[2 8 10 2],Fast\n', '23,Vanadium,V,[2 8 11 2],Fast\n', '24,Krom,Cr,[2 8 13 1],Fast\n', '25,Mangan,Mn,[2 8 13 2],Fast\n', '26,Jern,Fe,[2 8 14 2],Fast\n', '27,Kobolt,Co,[2 8 15 2],Fast\n', '28,Nikkel,Ni,[2 8 16 2],Fast\n', '29,Kobber,Cu,[2 8 18 1],Fast\n', '30,Sink,Zn,[2 8 18 2],Fast\n', '31,Gallium,Ga,[2 8 18 3],Fast\n', '32,Germanium,Ge,[2 8 18 4],Fast\n', '33,Arsen,As,[2 8 18 5],Fast\n', '34,Selen,Se,[2 8 18 6],Fast\n', '35,Brom,Br,[2 8 18 7],Væske\n', '36,Krypton,Kr,[2 8 18 8],Gass\n', '37,Rubidium,Rb,[2 8 18 8 1],Fast\n', '38,Strontium,Sr,[2 8 18 8 2],Fast\n', '39,Yttrium,Y,[2 8 18 9 2],Fast\n', '40,Zirkonium,Zr,[2 8 18 10 2],Fast\n', '41,Niob,Nb,[2 8 18 12 1],Fast\n', '42,Molybden,Mo,[2 8 18 13 1],Fast\n', '43,Technetium,Tc,[2 8 18 13 2],Fast\n', '44,Ruthenium,Ru,[2 8 18 15 1],Fast\n', '45,Rhodium,Rh,[2 8 18 16 1],Fast\n', '46,Palladium,Pd,[2 8 18 18],Fast\n', '47,Sølv,Ag,[2 8 18 18 1],Fast\n', '48,Kadmium,Cd,[2 8 18 18 2],Fast\n', '49,Indium,In,[2 8 18 18 3],Fast\n', '50,Tinn,Sn,[2 8 18 18 4],Fast']

Som vi ser er linjer en liste med strings.

Vi kan skrive ut hver enkelt linje på denne måten:

with open("atomer.txt", "r", encoding = "utf-8") as file:
    linjer = file.readlines() # Alle linjene lagres i listen "linjer"

for x in linjer:
    print(x) # x er hver enkelt linje

Hoppe over linjer#

Datafiler kan ofte ha linjer som ikke er relevant data, men informasjon om strukturen.

Atomnr,Navn,Symbol,Elektronkonfigurasjon,Tilstand
1,Hydrogen,H,[1],Gass
2,Helium,He,[2],Gass
3,Litium,Li,[2 1],Fast
4,Beryllium,Be,[2 2],Fast

Disse linjene kan vi hoppe over med file.readline().

with open("atomer.txt", "r", encoding = "utf-8") as file:
    file.readline() # Hopper over en linje
    linjer = file.readlines() # Alle linjene lagres i listen "linjer"

print(linjer) # Skriver ut linjene som en liste
['1,Hydrogen,H,[1],Gass\n', '2,Helium,He,[2],Gass\n', '3,Litium,Li,[2 1],Fast\n', '4,Beryllium,Be,[2 2],Fast\n', '5,Bor,B,[2 3],Fast\n', '6,Karbon,C,[2 4],Fast\n', '7,Nitrogen,N,[2 5],Gass\n', '8,Oksygen,O,[2 6],Gass\n', '9,Fluor,F,[2 7],Gass\n', '10,Neon,Ne,[2 8],Gass\n', '11,Natrium,Na,[2 8 1],Fast\n', '12,Magnesium,Mg,[2 8 2],Fast\n', '13,Aluminium,Al,[2 8 3],Fast\n', '14,Silisium,Si,[2 8 4],Fast\n', '15,Fosfor,P,[2 8 5],Fast\n', '16,Svovel,S,[2 8 6],Fast\n', '17,Klor,Cl,[2 8 7],Gass\n', '18,Argon,Ar,[2 8 8],Gass\n', '19,Kalium,K,[2 8 8 1],Fast\n', '20,Kalsium,Ca,[2 8 8 2],Fast\n', '21,Scandium,Sc,[2 8 9 2],Fast\n', '22,Titan,Ti,[2 8 10 2],Fast\n', '23,Vanadium,V,[2 8 11 2],Fast\n', '24,Krom,Cr,[2 8 13 1],Fast\n', '25,Mangan,Mn,[2 8 13 2],Fast\n', '26,Jern,Fe,[2 8 14 2],Fast\n', '27,Kobolt,Co,[2 8 15 2],Fast\n', '28,Nikkel,Ni,[2 8 16 2],Fast\n', '29,Kobber,Cu,[2 8 18 1],Fast\n', '30,Sink,Zn,[2 8 18 2],Fast\n', '31,Gallium,Ga,[2 8 18 3],Fast\n', '32,Germanium,Ge,[2 8 18 4],Fast\n', '33,Arsen,As,[2 8 18 5],Fast\n', '34,Selen,Se,[2 8 18 6],Fast\n', '35,Brom,Br,[2 8 18 7],Væske\n', '36,Krypton,Kr,[2 8 18 8],Gass\n', '37,Rubidium,Rb,[2 8 18 8 1],Fast\n', '38,Strontium,Sr,[2 8 18 8 2],Fast\n', '39,Yttrium,Y,[2 8 18 9 2],Fast\n', '40,Zirkonium,Zr,[2 8 18 10 2],Fast\n', '41,Niob,Nb,[2 8 18 12 1],Fast\n', '42,Molybden,Mo,[2 8 18 13 1],Fast\n', '43,Technetium,Tc,[2 8 18 13 2],Fast\n', '44,Ruthenium,Ru,[2 8 18 15 1],Fast\n', '45,Rhodium,Rh,[2 8 18 16 1],Fast\n', '46,Palladium,Pd,[2 8 18 18],Fast\n', '47,Sølv,Ag,[2 8 18 18 1],Fast\n', '48,Kadmium,Cd,[2 8 18 18 2],Fast\n', '49,Indium,In,[2 8 18 18 3],Fast\n', '50,Tinn,Sn,[2 8 18 18 4],Fast']

Som vi ser har vi nå hoppet over den første linjen som ikke er en del av datasettet.

Håndtere tall#

Tall representeres i en datafil som tekst. Dette må vi håndtere om vi skal skrive eller lese fra en fil.

Skrive tall i fil#

Når vi skriver til en fil må vi skrive tekst. Da må vi gjøre tall til tekst med str()-funksjonen, eller bruke f-string-formatering.

Her er et program som lager en fil med noen navn og gir de et terningkast mellom 1 og 6.

from random import randint
navn_liste = ["Siril", "Aage", "Norah", "Idun", "Ismail"]

with open("terningkast.txt", "w") as file:
    for x in navn_liste:
        file.write(x + " " + str(randint(1, 6)) + "\n")

Analysere tall fra fil#

Når vi åpner og leser fra en fil får vi bare tekst. Hvis vi skal regne med tall, må vi gjøre teksten om til tall med int() eller float().

Her er et program som leser filen terningkast.txt og gir gjennomsnittet av terningkastene.

with open("terningkast.txt") as file:
    linjer = file.readlines()

total = 0
antall = 0
for x in linjer:
    # Ignorerer den siste tomme linjen
    if x != "":
        antall += 1

        # Finner terningkastet ved å splitte linjene på mellomrom og hente indeks 1
        terningkast = x.split()[1]

        # Gjør terningkastet fra string til et tall
        total += int(terningkast)

print(f"Gjennomsnitt: {total / antall}")
Gjennomsnitt: 4.4

Oppgaver#

Oppgave 1 🧪

I denne oppgaven skal vi håndtere filen atomer.txt som inneholder informasjon om mange grunnstoffer.

Last ned filen atomer.txt.

Skriv ut navnene til alle grunnstoffene som ikke er i fast form ved romtemperatur.

Navnene kan for eksempel skrives ut på denne måten:

Hydrogen (H)
Helium (He)
...

Oppgave 2 🕹️

Elevene på en skole var med i en spillkonkurranse. Navnene deres og poengene deres ble samlet i datafilen under.

Last ned filen score.txt.

  1. Hva var gjennomsnittlig score?

  2. Hvem hadde flest poeng?

Oppgave 3 🐍

Ånei! En hel haug med Python-slanger* har infisert risåkeren min!

Last ned filen slanger.txt

Hvor mange slanger er det i gjennomsnitt per rad i åkeren min?

(*) må ikke forveksles med pytonslanger.