IN1000 høst2024
Introduksjon til objektorientert programmering (Python)
05.07 Maks ord per linje
I denne oppgave skal du lage et program som tar inn en tekst og skriver den ut til en fil. I utdatafilen er det et maksimalt antall ord som er tillatt per linje.
a) Lag en prosedyre format_text()
som tar inn en string tekst
, en string filnavn
og et heltall maks_ord
.
- tekst
er det som skrives til fil
- filnavn
er navnet på utdatafilen
- maks_ord
er maksimalt antall ord per linje
Prosedyren skal...
- ... dele stringen tekst
i ord
- ... skrive hvert ord til filen
- ... passe på at ikke flere ord enn maks_ord
skrives på hver linje
Du kan bruke en tellervariabel for å holde oversikt over hvor mange ord du har skrevet til filen. Hver gang maks_ord
er nådd for linjen, skriv en linjeskrift-karater ("\n") til filen.
b) Test programmet med følgende verdier og sjekk at filen "test.out" opprettes og inneholder det som forventes:
- Teksten: "I denne oppgave skal du lage et program som tar inn en tekst og skriver den ut til en fil. I utdatafilen er det maksimalt antall ord som er tillatt per linje."
- Filnavn: "test.out"
- Maks antall ord per linje: 5
Forventet resultat:
I denne oppgave skal du
lage et program som tar
inn en tekst og skriver
den ut til en fil.
I utdatafilen er det maksimalt
antall ord som er tillatt
per linje.
Husk å åpne og lukke filen!
def format_text(tekst, filnavn, maks_ord):
ordene = tekst.split()
fil = open(filnavn, "w")
teller = 0
for min_ord in ordene:
teller += 1
fil.write(min_ord)
fil.write(" ") # inkluder mellomrom mellom ordene.
# kan også bruke "if teller % maks_ord == 0"
if teller == maks_ord:
teller = 0
fil.write("\n")
fil.close()
tekst = "I denne oppgave skal du lage et program som tar inn en tekst og skriver den ut til en fil. I utdatafilen er det maksimalt antall ord som er tillatt per linje."
format_text(tekst, "test.out", 5)
05.08 Linjefilter
I denne oppgaven skal du skrive en prosedyre som skriver ut alle linjene i en gitt tekstfil som ikke inneholder 'NA' til en ny fil.
I tabulær filer brukes verdien 'NA' (“not available”) for å betegne manglende informasjon. Vurder følgende tabulær fil med NA-verdier:
Name,Sex,Age,Height(in),Weight(lbs)
Alex,M,41,74,NA
Bert,M,NA,68,166
Carl,M,32,70,155
Dave,M,NA,72,167
Elly,F,30,66,124
Fran,F,33,NA,115
Gwen,F,26,64,121
Hank,M,30,71,158
Ivan,M,53,NA,175
Jake,M,32,69,143
Kate,F,47,69,139
Luke,M,34,72,163
Myra,F,NA,62,98
Neil,M,36,75,160
Omar,M,38,70,145
Page,F,31,67,NA
Quin,M,29,71,176
Ruth,F,28,65,131
Lagre teksten over i en .csv-fil kalt input_med_na.csv
a) Skriv prosedyren fil_na_filter()
som tar inn to strenger som parameter: et inputfilnavn og et outputfilnavn.
b) Åpne filene og lagre dem i variablene input_fil
og output_fil
c) For hver linje i input_fil
skal den skrives til output_fil
hvis linjen ikke inneholder verdien 'NA'.
Hint
Bruk in
d) Kall prosedyren med "input_med_na.csv" som inputfil og "output_uten_na.csv" som outputfil. Inspiser at outputfilen opprettes og inneholder det som forventes.
def fil_na_filter(input_filnavn, output_filnavn):
input_fil = open(input_filnavn, "r")
output_fil = open(output_filnavn, "w")
for linje in input_fil:
if "NA" not in linje:
output_fil.write(linje)
# Har du husket å lukke filene?
input_fil.close()
output_fil.close()
fil_na_filter("input_med_na.csv", "output_uten_na.csv")
Forventet resultat:
Name,Sex,Age,Height(in),Weight(lbs)
Carl,M,32,70,155
Elly,F,30,66,124
Gwen,F,26,64,121
Hank,M,30,71,158
Jake,M,32,69,143
Kate,F,47,69,139
Luke,M,34,72,163
Neil,M,36,75,160
Omar,M,38,70,145
Quin,M,29,71,176
Ruth,F,28,65,131
05.09 Skriv ut første/siste antall linjer
a) Skriv en prosedyre opprett_filen()
som oppretter en fil test.in og skriver 10 linjer til filen. Linjene kan inneholde hva som helst men de bør ikke være helt like.
b) Skriv en prosedyre skriv_ut_foerste_linjer()
som tar inn to parametre: en streng filnavn
og et heltall antall_linjer
. Prosedyren skal lese de første antall_linjer
linjene i filen og skrive dem ut til terminalen.
Hint
For å ikke skrive ut to linjeskift, bruk strip()
eller print(sep="")
for å fjerne linjeskift.
c) Skriv en ny prosedyre skriv_ut_siste_linjer()
som har de samme parametre som prosedyren i b), men som skriver ut de siste antall_linjer
linjene til terminalen
Hint
Du må først lese inn hele filen.
d) Kall prosedyrene for å opprette filen "test.in" og skrive ut de første og siste 5 linjer. Skriv gjerne en tom linje mellom prosedyrekallene for å dele opp resultatene
a)
def opprett_filen():
fil = open("test.in", "w")
for i in range(10):
linje = "linje " + str(i + 1)
fil.write(linje)
fil.write("\n")
fil.close()
b)
def skriv_ut_foerste_linjer(filnavn, antall_linjer):
fil = open(filnavn, "r")
idx = 0
for linje in fil:
if idx < antall_linjer:
print(linje.strip())
idx += 1
fil.close()
c)
def skriv_ut_siste_linjer(filnavn, antall_linjer):
fil = open(filnavn, "r")
linjene = []
for linje in fil:
linjene.append(linje.strip())
fil.close()
indeks = len(linjene) - antall_linjer
for linje in linjene[indeks:]:
print(linje)
d)
opprett_filen()
skriv_ut_foerste_linjer("test.in", 5)
print()
skriv_ut_siste_linjer("test.in", 5)