IN1000 høst2024
Introduksjon til objektorientert programmering (Python)
05.01: Lesing fra fil
Filnavn: les_fil.py og navn.txt
a) Opprett en tekstfil kalt navn.txt, som du legger i samme mappe som les_fil.py. Tekstfilen skal inneholde navnene under:
Anne
Bjarne
Carina
David
Elise
Frode
b) Bruk open()
for å åpne navn.txt i pythonprogrammet.
c) Opprett en tom liste med navn navn_liste
d) Skriv en løkke som går gjennom filen, linje for linje, og legger linjene inn i listen.
NB: Husk å lukke filen når du er ferdig
e) Skriv ut listen til terminal.
b)
fil = open("navn.txt", "r")
c)
navn_liste = []
d)
for linje in fil:
navn_liste.append(linje)
fil.close()
e)
print(navn_liste)
05.05 Enkle tabulære filer
I denne øvelsen skal du skrive flere funksjoner som kan lese tabulære filer, dvs. som har data organisert i rader og kolonner, og lagre innholdet i forskjellige samlinger.
Del 1
Filnavn: bil.txt, bil.py
a) Opprett en tekstfil kalt bil.txt, som inneholder følgende tekst og legger i samme mappe som bil.py:
brand:Ford
model:Mustang
year:1964
b) Skriv en funksjon, les_bil(filnavn)
, i bil.py som kan lese bil.txt. Funksjonen skal...
- ... lage en tom ordbok, resultatet
- ... gå gjennom filen og dele hver linje i to kolonner etter ":" (kolon).
Sørg også for at linjeskift er fjernet.
- ... for hver linje lagre den første kolonnen som ordboknøklen, og den andre kolonnen som ordbokverdien.
- ... returnere ordboken
c) Skriv ut resultatet
Del 2
Filnavn: song_contest.txt, song_contest.py
a) Opprett en tekstfil song_contest.txt som inneholder følgende teskt:
2016 Ukrania
2017 Portugal
2018 Israel
2019 Nederland
2020 avlyst
2021 Italia
b) Skriv en funksjon, les_song_contest(filnavn)
i song_contest.py som kan lese song_contest.txt. Funksjonen skal...
- ... opprette to lister, årene
og landene
- ... gå gjennom filen og dele hver linje i to kolonner etter mellomrom.
Sørg også for at linjeskift er fjernet.
- ... lagre den første verdien i listen årene
og den andre verdien i listen landene
.
- ... opprette en ordbok song_contest
som inneholder nøkkelen år
med listen av årene som verdi og nøkkelen land
med listen av landene som verdi.
- ... returnere ordboken
c) Skriv ut resultatet
Del 3
Filnavn: poeng.txt, poeng.py
a) Opprett en tekstfil poeng.txt som inneholder følgende teskt:
Mari:3,5,3,6
Erik:2,4,5,3
Silje:3,5,4,6
Ola:2,5,4,5
b) Skriv en funksjon, les_poeng(filnavn)
i poeng.py som kan lese poeng.txt. Funksjonen skal...
- ... opprette en tom ordbok poeng
- ... gå gjennom filen og dele hver linje i to kolonner etter ":" (kolon).
Sørg også for at linjeskift er fjernet.
- ... dele opp strengen av antall poeng på "," (komma). Dette resulterer i en liste.
- ... sette dataen i ordboken poeng
der navn er nøkkelen og listen av poeng til personen er tilhørende verdi.
- ... returnere ordboken
c) Skriv ut resultatet
Utfordring: Skriv om funksjonen i Del 3 slik at verdiene i ordboken poeng
er et heltall som er summen av alle tall i listen i stedet for listen selv.
Del 1
def les_bil(filnavn):
# oppretter ordboken
resultatet = {}
for linje in open(filnavn):
linje = linje.strip()
kolonner = linje.split(":")
noekkel = kolonner[0]
verdi = kolonner[1]
# sette data i ordboken
resultatet[noekkel] = verdi
return resultatet
print(les_bil("bil.txt"))
Del 2
def les_song_contest(filnavn):
årene = []
landene = []
for linje in open(filnavn):
linje = linje.strip()
kolonner = linje.split()
årene.append(kolonner[0])
landene.append(kolonner[1])
song_contest = {"år": årene, "land": landene}
return song_contest
print(les_song_contest("song_contest.txt"))
Alternativ løsning:
def les_song_contest(filnavn):
årene = []
landene = []
for linje in open(filnavn):
linje = linje.strip()
år, land = linje.split()
årene.append(år)
landene.append(land)
song_contest = {"år": årene, "land": landene}
return song_contest
print(les_song_contest("song_contest.txt"))
Del 3
def les_poeng(filnavn):
resultatet = {}
for linje in open(filnavn):
linje = linje.strip()
kolonner = linje.split(":")
navn = kolonner[0]
poeng = kolonner[1].split(",")
resultatet[navn] = poeng
return resultatet
print(les_poeng("poeng.txt"))
c) - utfordring
def les_poeng(filnavn):
resultatet = {}
for linje in open(filnavn):
linje = linje.strip()
kolonner = linje.split(":")
navn = kolonner[0]
poeng = kolonner[1].split(",")
total = 0
for p in poeng: # må kastes om til et heltall
total += int(p)
resultatet[navn] = total
return resultatet
print(les_poeng("poeng.txt"))
05.06 Skriv til filer
a) Lag en prosedyre skriv_dna()
som skriver ut følgende linjer:
O---o
O-o
O
o-O
o---O
Hint
Du kan bruke print()
flere ganger, eller kalle print()
bare 1 gang og bruke linjeskift tegn "\n"
b) Endre prosedyren skriv_dna()
slik at den tar inn et filnavn som parameter og skriver strengen til filen i stedet for å skrive den ut til terminalen. Husk å lukke filen.
c) Kall prosedyren skriv_dna()
tre ganger med samme filnavn som argumentet. Hvordan ser den resulterende filen ut? Ser den ut som forventet?
d) Bonus: Les documentasjonen om mode-argumentet her. Endre prosedyren skriv_dna()
slik at den bruker 'append mode' i stedet for 'write mode' for å løse problemet fra c), og kjør programmet igjen.
a)
def skriv_dna():
print("O---o")
print(" O-o")
print(" O")
print(" o-O")
print("o---O")
eller
def skriv_dna():
print("O---o\n O-o\n O\n o-O\no---O")
b)
def skriv_dna(filnavn):
fil = open(filnavn, "w")
fil.write("O---o\n")
fil.write(" O-o \n")
fil.write(" O \n")
fil.write(" o-O \n")
fil.write("o---O\n")
fil.close()
eller
def skriv_dna(filnavn):
fil = open(filnavn, "w")
fil.write("O---o\n O-o\n O\n o-O\no---O\n")
fil.close()
c) Den resulterende filen inneholder stringen én gang, ikke tre ganger selv om prosedyren er kalt 3 ganger.
d) Bruk mode "a" (append) i stedet for "w" (write)
def skriv_dna(filnavn):
fil = open(filnavn, "a")
fil.write("O---o\n O-o\n O\n o-O\no---O\n")
fil.close()
skriv_dna("dna_fil.txt")
skriv_dna("dna_fil.txt")
skriv_dna("dna_fil.txt")
05.19: Noen telle-funksjoner
Denne oppgaven har tre deloppgaver som er uavhengige av hverandre. I hver av deloppgavene skal du skrive en funksjon.
a) Skriv en funksjon som tar et tall som parameter og returnerer det dobbelte av tallet.
b) Skriv en funksjon som tar inn en streng og et tall som parameter, og som returnerer True eller False basert på om strengens lengde er større enn tallet.
c) Skriv en funksjon som returnerer antall sifre i et tall. For eksempel er det 3 sifre i tallet 104. Det kan være nyttig å konvertere nummeret til en annen datatype.
a)
def dobbel(tall):
return tall * 2
b)
def lengreEnnTallet(streng, heltall):
return len(streng) > heltall
eller
def lengreEnnTallet(streng, heltall):
if len(streng) > heltall:
return True
else:
return False
c)
def antallSifre(heltall):
return len(str(heltall))
eller uten len()
:
def antallSifre(heltall):
teller = 0
for tegn in str(heltall):
teller += 1
return teller