Du er ikke logget inn. Så lenge du ikke er logget inn går du glipp av muligheten for å holde styr på din egen progresjon.

Filtrering:

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)