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.

Logg inn

Valgte tags:

Filtrering:

Skriv ut:

Lese fra fil 0: introduksjon

Å lese fra ei fil, og å skrive til ei fil, er ting vi ikke kommer utenom. Tekstene vi jobber med er ofte veldig store, og selv om vi kan kopiere og lime inn mindre strenger rett inn i programmet vårt, blir det fort knotete. Filer lar oss organisere data på mange måter, og filendelsene sier som regel noe om hva slags struktur man kan forvente, som i .txt, .csv, .tsv og .json. Python har støtte for å gjøre det enklere å lese visse typer filer, men stort sett alle filer kan leses inn uten å måtte bruke noen ekstrabiblioteker.

Når vi leser ei fil bruker vi funksjonen open(). Som med mange andre funksjoner, kan vi legge til flere argumenter etter behov.

Helt grunnleggende bruk er slik:

fila = open("minfil.txt")
teksten = fila.read()
fila.close()

I første linje åpner vi fila som et filobjekt. Et filobjekt er en spesiell datatype som vi kan gjøre forskjellige ting med.
På linje to bruker vi metoden .read() på filobjektet. Denne metoden gir oss hele filobjektet som en streng.
Til slutt lukker vi fila. Dette er viktig for å unngå at man prøver å åpne fila i to forskjellige programmer samtidig.

I eksempelet over vet Python at vi vil lese inn fila, det er egentlig det samme som å skrive:

fila = open("minfil.txt","r")

"r" står for read, og er underforstått. Hvis vi skriver "w" så åpner vi for at vi kan skrive til ei fil, og hvis vi bruker "a" så kan vi legge noe til i ei fil. Vi kommer tilbake til skriving seinere.

Vi kan også spesifisere encoding. Det meste passer med utf-8, som er en ny og fin standard, men i noen tilfeller må man spesifisere andre typer. Vi går ikke inn på de spesielle typene her.

fila = open("minfil.txt","r",encoding="utf-8")

Vi bruker nøkkelordargumentet "encoding" for å spesifisere det.

Når vi har lest inn ei fil, er det flere måter vi kan få tak i teksten på. Måten vi gjør det på avhenger av behovet vårt. I eksemplene under brukes teksten "testtekst.txt"

En måte er å gjøre som over, å bruke .read(). Hvis vi vil ha hver setning i en tekst, kan vi så splitte denne fila senere.

```python
fila = open("minfil.txt")
teksten = fila.read()
setninger = teksten.split("\n")
fila.close()

En annen måte er å bruke metoden .readlines()

```python
Gå på plasser der det er litt lysåpen skog, der sola kommer ned på bakken, og der det er litt tørt.
Ikke i tett skog.
Hvis du har en tursti eller ei bymark i nærheten, skal du ikke gå langt for å finne blåbærlyngen.
I lavlandet i sør er sesongen på hell, men i høyden og lenger nord er det fortsatt tid igjen.

['Gå på plasser der det er litt lysåpen skog, der sola kommer ned på bakken, og der det er litt tørt.', 'Ikke i tett skog.', 'Hvis du har en tursti eller ei bymark i nærheten, skal du ikke gå langt for å finne blåbærlyngen.', 'I lavlandet i sør er sesongen på hell, men i høyden og lenger nord er det fortsatt tid igjen.', '']

Vi kan også rett og slett iterere over filobjektet:

fila = open("mini.txt","r",encoding="utf-8")

for linje in fila:
    print(linje)
fila.close()
Gå på plasser der det er litt lysåpen skog, der sola kommer ned på bakken, og der det er litt tørt.

Ikke i tett skog.

Hvis du har en tursti eller ei bymark i nærheten, skal du ikke gå langt for å finne blåbærlyngen.

I lavlandet i sør er sesongen på hell, men i høyden og lenger nord er det fortsatt tid igjen.

Vi kan også bruke metoden readlines() og .readline() legg merke til flertallsendelsen. .readline() leser én og én linje, og hver gang du kaller på readline() så får du neste setning.

Koden under gir lik utskrift som over:

fila = open("mini.txt","r",encoding="utf-8")

for linje in fila.readlines():
    print(linje)
fila.close()

Men en forskjell mellom å bruke .readlines() og å iterere gjennom filobjektet, er at vi kan bruke .readlines() til å lagre linjene i en annen variabel. Filobjektet er en iterator, en datatype som kun kan kalles på én gang. Vi kan undersøke dette ved å bruke type(). Å gå igjennom selve filobjektet kan være lurt hvis vi har med veldig store filer å gjøre.

fila = open("mini.txt","r",encoding="utf-8")

linjer = fila.readlines()
print(type(linjer))

fila.close()

Gir utskriften:

<class 'list'>

readline() er mer nyttig hvis vi vil behandle ett og ett element. Vi kan bruke den sammen med en while-løkke og la den kjøre helt til elementet er en tom streng, som viser at vi har kommet til slutten av dokumentet. Utskriften er lik som i de andre tilfellene.

fila = open("mini.txt","r",encoding="utf-8")

neste = fila.readline()
while neste != "":
    print(neste)
    neste = fila.readline()

fila.close()

Å skrive til fil er ganske likt. Vi må åpne og lukke fila vi vil skrive. Hvis vi har åpnet fila med "w" så vil det vi skriver overskrive hele fila hver gang. Hvis vi har åpnet fila med "a" så vil det vi skriver legges til slutten av fila. I begge tilfeller bruker vi metoden .write() på filobjektet. .write() tar en streng. Vi må huske å lukke filen i dette tilfellet også. Hvis vi skriver én og én linje, for eksempel gjennom en for-løkke, så må vi i noen tilfeller huske å legge til et ekstra linjeskift for at teksten skal komme på individuelle linjer, hvis det er det vi vil.

fila = open("mini.txt","w",encoding="utf-8")

streng = "Denne setningen vil jeg lagre.\n"

fila.write(streng)

fila.close()