Vi leser data fra en fil

💡 Læringsmål: I dette kapittelet lærer du hvordan du leser data fra en fil.

Lag deg en .py-fil som du vil skrive programmet ditt i, og kopier fila serier.txt til samme mappe som Python-filen.

Det er fila serier.txt vi skal arbeide med. Hver linje i denne fila inneholder serieId og tittel for en tv-serie, separert med ,. Vi skal lese fila, splitte innholdet og skrive ut alle titlene i fila.

For å lese en fil må vi først åpne fila, deretter kan vi lese ut innholdet. Funksjonen open brukes for å åpne fila, du kan lese mer om denne funksjonen i Python-dokumentasjonen.

fil = open("serier.txt", "r")

Første argumentet til open er navnet på fila, det andre argumentet angir hva slags modus fila skal åpnes i, r står for read, det vil si lesemodus. Dette er også default-verdien, så r kan utelates om man kun skal lese fila.

Når vi har åpnet fila kan vi lese ut alt som tekst med funksjonen read. Legg til linjene under og kjør programmet.

tekst = fil.read()
print(tekst)

Ser du noe rart i det som skrives ut? For eksempel at tittelen til "Fra bølle til bestevenn" ser ut som Fra bølle til bestevenn. Det er fordi fila leses med feil tegnsett. Det kan vi løse ved å sende tegnsettet vi ønsker som argument til open, med parameteren encoding. Endre linja med open til følgende:

fil = open("serier.txt", "r", encoding="utf-8")

Her sier vi eksplisitt at fila skal enkodes med utf-8.

Når man har åpnet en fil er det fint å lukke den pent etter seg når man er ferdig med den. Det er to måter å gjøre det på, den ene måten er å ha en linje etter at man er ferdig med filen, som lukker den, fil.close(). Det vi i stedet vil gjøre er å bruke en with-blokk. Da vet Python at den skal lukke fila når man går ut av blokken. og vi slipper selv å huske på det, og å finne ut hvor i koden det er lurt å lukke fila. Med with kan det se slik ut:

with open("serier.txt", "r", encoding="utf-8") as fil:
    tekst = fil.read()
    print(tekst)

Bytt ut innholdet i programmet ditt med linjene over og se at programmet kjører som før.

Vi leser nå hele filen som en lang streng, men for å oppnå målet vårt med å skrive ut en liste med bare titlene må vi kunne lese hver linje for seg. Det er flere måter å få til det på. Fil har en metode readlines(), men det som er upraktisk med den er at den beholder linjeskift-tegnet \n i slutten av hver linje. I stedet bruker vi string sin metode splitlines(). Vi kan derfor bytte ut innholdet i with-blokka med følgende linjer:

    linjer = fil.read().splitlines()
    for linje in linjer:
        print(linje)

Men fortsatt er vi ikke helt i mål, nå skriver vi ut hele linja, ikke bare tittelen. For å få tak i tittelen kan vi bruke split-metoden til string, som deler en streng for hver gang den finner det angitte skilletegnet.

✍️ Oppgave: Kan du fullføre programmet slik at det bare skriver ut tittelen?

    for linje in linjer:
        deler = linje.split(",")
        # print(???)

✍️ Oppgave: Finn eller lag en fil med tekstlig innhold, og eksperimenter med å lese fila og skrive ut innholdet i terminalen

Om du trenger litt inspirasjon kan du se om du liker noen av csv-filene på denne siden.