Introduksjon
For å jobbe med lagrede data blir filhåndtering kjernekunnskapen til enhver profesjonell Python-programmerer. Helt fra den tidligste utgivelsen er både lesing og skriving av data til filer innebygde Python-funksjoner. Sammenlignet med andre programmeringsspråk som C eller Java, er det ganske enkelt og krever bare noen få linjer med kode. Videre må ingen ekstra modul lastes inn for å gjøre det riktig.
I denne artikkelen vil vi forklare hvordan du leser filer med Python gjennom eksempler. Noen eksempler inkluderer å lese en fil linje for linje, som en del (et definert antall linjer om gangen), og å lese en fil på en gang. Vi vil også vise deg en måte å lese en bestemt linje fra filen, bare, uten å søke i hele filen.
Grunnleggende om filer i Python
De vanlige metodene for å operere med filer er open()
for å åpne en fil, seek()
for å angi filens gjeldende posisjon ved den gitte forskyvningen, og close()
for å lukke filobjektet når du er ferdig med å bruke det. Den innebygde open()
funksjonen returnerer et filhåndtak som representerer et filobjekt som skal brukes for å få tilgang til filen for lesing, skriving eller vedlegg.
Når du åpner en fil for lesing, må Python vite nøyaktig hvordan filen skal åpnes med systemet. To tilgangsmoduser er tilgjengelige – lesing og lesing i binær modus. De respektive flaggene som brukes er 'r'
og 'rb'
, og må spesifiseres når du åpner en fil med den innebygde open()
funksjon. Den første modusen inkluderer tolkning av spesialtegn som "CR" (vognretur) og "LF" (linjemating) for å representere linjeskift, mens den binære modusen lar deg lese dataene i råmodus - hvor dataene lagres som de er. uten videre tolkning.
Når du har åpnet en fil, vil open()
funksjon vil returnere et filobjekt til deg. Disse filobjektene har metoder som read()
, readline()
, write()
, tell()
og seek()
. Mens noen filobjekter (eller fillignende objekter) har flere metoder enn de som er oppført her, er disse de vanligste. Ikke alle filobjekter trenger å implementere alle filmetodene.
Lese en fil linje for linje
Det første eksemplet er inspirert av de to programmeringsspråkene – C og C++. Det er sannsynligvis den mest intuitive tilnærmingen - åpne filen ved å bruke open()
funksjon, les filen linje for linje bruker readline()
metoden, og skriv ut linjen umiddelbart etter lesing.
I bruk her er en while
loop som kontinuerlig leser fra filen så lenge readline()
metoden fortsetter å returnere data. I tilfelle slutten av filen (EOF) nås while
loop stopper og filobjektet lukkes, og frigjør ressursene for andre programmer å bruke:
filename = "test.txt"
filehandle = open(filename, 'r')
while True:
line = filehandle.readline()
if not line:
break
print(line)
filehandle.close()
Som du kanskje har lagt merke til, har vi eksplisitt åpnet og lukket filen i dette eksemplet. Selv om Python-tolken lukker de åpnede filene automatisk på slutten av kjøringen av Python-programmet, lukker man eksplisitt filen via close()
er en god programmeringsstil, og bør ikke glemmes.
Som en forbedring er praktisk iteratorprotokoll ble introdusert i Python 2.3. Dette lar deg forenkle readline
Løkke:
filename = "test.txt"
for line in open(filename, 'r'):
print(line)
I bruk her er en for
løkke i kombinasjon med in
iterator. Den nåværende linjen identifiseres ved hjelp av in
iterator, leses fra filen, og innholdet sendes ut til stdout
. Python dekker åpning og lukking av filen for deg når den faller utenfor rekkevidden. Selv om det er ineffektivt, lar dette deg slippe å håndtere filhåndtak lenger.
Dessverre er koden ovenfor mindre eksplisitt og er avhengig av Pythons interne søppelsamling for å håndtere lukking av filen.
Introdusert i Python 2.5, den with
kommandoen innkapsler hele prosessen enda mer, og håndterer også åpning og lukking av filer bare én gang gjennom hele kodeblokken:
filename = "test.txt"
with open(filename, 'r') as filehandle:
for line in filehandle:
print(line)
Kombinasjonen av with
uttalelse og open()
kommandoen åpner filen bare én gang. Hvis vellykket for
loop utføres, og innholdet i linjen skrives ut stdout
.
Videre er bruken av with
uttalelse har en bivirkning. Internt lager Python-tolken en try
-finally
-blokk for å kapsle inn lesing fra filen. Følgende eksempel viser hva som egentlig skjer internt i Python med with
kodeblokker:
try:
filehandle = open(filename, 'r')
finally:
filehandle.close()
Lese en fil som biter av linjer
Til nå har vi behandlet en fil linje for linje. Dette er ganske tregt for store filer og kan forbedres ved å lese flere linjer samtidig. For å oppnå det, må islice()
metoden fra verktøy modul kommer inn i bildet. Den fungerer også som en iterator og returnerer en mengde data som består av n
linjer. På slutten av filen kan resultatet bli kortere, og til slutt vil samtalen returnere en tom liste:
from itertools import islice
filename = "test.txt"
number_of_lines = 5
with open(filename, 'r') as input_file:
lines_cache = islice(input_file, number_of_lines)
for current_line in lines_cache:
print (current_line)
Lese en spesifikk linje fra en fil
Ved å bruke metodene vist ovenfor kan vi også utføre andre nyttige handlinger, som å lese en spesifikk linje fra en fil. For å gjøre dette bruker vi en teller og skriver ut riktig linje når vi kommer til den mens vi gjentar filen:
filename = "test.txt"
line_number = 3
print (f"line {line_number} of {filename} is: ")
with open(filename, 'r') as filehandle:
current_line = 1
for line in filehandle:
if current_line == line_number:
print(line)
break
current_line += 1
Dette skal være enkelt å forstå, men det er litt lengre enn de tidligere eksemplene. Den kan forkortes ved hjelp av linecache modul.
Følgende eksempel viser hvordan du forenkler koden ved å bruke getline()
metode. Hvis det forespurte linjenummeret faller utenfor rekkevidden av gyldige linjer i filen, vil getline()
metoden returnerer en tom streng i stedet:
import linecache
filename = "test.txt"
line_number = 3
line = linecache.getline(filename, line_number)
print (f"line {line_number} of {filename}:")
print (line)
Leser hele filen på en gang
Sist, men ikke minst, skal vi se på en helt annen sak enn det forrige eksemplet – å lese en hel fil på én gang.
Husk at du i de fleste tilfeller bør ha nok minne til å lese hele filen, siden tegn ikke tar for mye plass, men blir lei av store filer. Følgende eksempel bruker en kombinasjon av with
uttalelse, og read()
metode. I dette tilfellet bruker vi read()
for å laste inn filinnholdet som en datastrøm:
Sjekk ut vår praktiske, praktiske guide for å lære Git, med beste praksis, bransjeaksepterte standarder og inkludert jukseark. Slutt å google Git-kommandoer og faktisk lære den!
filename = "test.txt"
with open(filename, 'r') as filehandle:
filecontent = filehandle.read()
print (filecontent)
Python tilbyr også readlines()
metode, som ligner på readline()
metode fra det første eksemplet. I motsetning til read()
, er filinnholdet lagret i en liste, der hver linje i innholdet er et element:
filename = "test.txt"
with open(filename, 'r') as filehandle:
filecontent = filehandle.readlines()
for line in filecontent:
print (line)
Samtidig som readlines()
vil lese innhold fra filen til den treffer EOF, husk at du også kan begrense mengden innhold som leses ved å gi sizehint
parameter, som er antall byte som skal leses.
konklusjonen
Som vanlig er det mer enn én måte å lese innholdet i en fil på. Hastighetsmessig er alle mer eller mindre i samme kategori. Hvilken løsning som fungerer best for deg avhenger av din spesifikke brukssituasjon. Vi tror det er ganske nyttig å se hva som er mulig og deretter velge den løsningen som passer best.
Selv om Python i stor grad forenkler prosessen med å lese filer, kan det fortsatt bli vanskelig til tider, i så fall vil jeg anbefale deg å ta en titt på offisiell Python-dokumentasjon for mer info.