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")
Eksempel med f-strings
Her er programsnutten over med f-strings i stedet.
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(f"{x} {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)
...
Løsningsforslag
with open("atomer.txt", encoding="utf8") as file:
file.readline()
linjer = file.readlines()
for linje in linjer:
navn = linje.split(",")[1]
symbol = linje.split(",")[2]
tilstand = linje.split(",")[4].strip() # Fjerner også \n
if tilstand != "Fast":
print(f"{navn} ({symbol})")
Hydrogen (H)
Helium (He)
Nitrogen (N)
Oksygen (O)
Fluor (F)
Neon (Ne)
Klor (Cl)
Argon (Ar)
Brom (Br)
Krypton (Kr)
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
.
Hva var gjennomsnittlig score?
Hvem hadde flest poeng?
Løsningsforslag
Her er et løsningsforslag som løser begge oppgavene.
with open("score.txt") as file:
linjer = file.readlines()
total_score = 0
antall_spillere = 0
maks_score = 0
vinner = ""
for x in linjer:
# Ignorerer en mulig tom linje
if x != "":
# Oppdaterer antall_spillere
antall_spillere += 1
# Deler linjer i navn og score
navn = x.strip().split()[0]
score = int(x.strip().split()[1])
# Legger til score på total score
total_score += score
# Hvis poengsummen er større enn maks_score, sett ny maks_score
if score > maks_score:
maks_score = score
vinner = navn
print(f"Gjennomsnittlig score: {total_score / antall_spillere}")
print(f"Høyest score: {vinner} med {maks_score} poeng")
Gjennomsnittlig score: 484.7573964497041
Høyest score: Regine med 995 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.
Løsningsforslag
with open("slanger.txt", encoding="utf8") as file:
totalt_slanger = 0
totalt_rader = 0
for linje in file.readlines():
slanger_rad = 0
for tegn in linje:
if tegn == "🐍":
slanger_rad += 1
totalt_slanger += slanger_rad
totalt_rader += 1
print(f"Det er i gjennomsnitt {totalt_slanger/totalt_rader} Python-slanger per rad i åkeren.")
Det er i gjennomsnitt 14.23 Python-slanger per rad i åkeren.