Læsning af filer med Python

Introduktion

For at arbejde med lagrede data bliver filhåndtering kerneviden for enhver professionel Python-programmør. Lige fra den tidligste udgivelse er både læsning og skrivning af data til filer indbyggede Python-funktioner. I sammenligning med andre programmeringssprog som C eller Java er det ret simpelt og kræver kun et par linjer kode. Desuden skal der ikke indlæses noget ekstra modul for at gøre det korrekt.

I denne artikel vil vi forklare, hvordan man læser filer med Python gennem eksempler. Nogle eksempler inkluderer læsning af en fil linje for linje, som en del (et defineret antal linjer ad gangen) og læsning af en fil på én gang. Vi vil også vise dig en måde at læse en specifik linje fra filen, kun uden at søge i hele filen.

Grundlæggende om filer i Python

De almindelige metoder til at arbejde med filer er open() for at åbne en fil, seek() for at indstille filens aktuelle position ved den givne offset, og close() for at lukke filobjektet, når du er færdig med at bruge det. Den indbyggede open() funktion returnerer et filhåndtag, der repræsenterer et filobjekt, der skal bruges til at få adgang til filen til læsning, skrivning eller tilføjelse.

Når du åbner en fil til læsning, skal Python vide præcis, hvordan filen skal åbnes med systemet. To adgangstilstande er tilgængelige – læsning og læsning i binær tilstand. De respektive flag, der anvendes, er 'r'og 'rb', og skal angives, når du åbner en fil med den indbyggede open() fungere. Den første tilstand inkluderer fortolkning af specialtegn som "CR" (vognretur) og "LF" (linefeed) for at repræsentere linjeskift, hvorimod den binære tilstand giver dig mulighed for at læse dataene i rå tilstand - hvor dataene gemmes, som de er. uden yderligere fortolkning.

Når du har åbnet en fil, vil den open() funktion vil returnere et filobjekt til dig. Disse filobjekter har metoder som read(), readline(), write(), tell()og seek(). Mens nogle filobjekter (eller fillignende objekter) har flere metoder end dem, der er anført her, er disse de mest almindelige. Ikke alle filobjekter behøver at implementere alle filmetoderne.

Læsning af en fil linje for linje

Det første eksempel er inspireret af de to programmeringssprog – C og C++. Det er nok den mest intuitive tilgang - åbn filen ved hjælp af open() fungere, læs filen linje for linje ved hjælp af readline() metode, og output linjen umiddelbart efter læsning.

I brug her er en while loop, der kontinuerligt læser fra filen, så længe readline() metoden bliver ved med at returnere data. I tilfælde af at slutningen af ​​filen (EOF) nås while loop stopper, og filobjektet lukkes, hvilket frigør ressourcerne for andre programmer at bruge:


filename = "test.txt"

filehandle = open(filename, 'r')
while True:
    
    line = filehandle.readline()
    if not line:
        break
    print(line)


filehandle.close()

Som du måske har bemærket, har vi eksplicit åbnet og lukket filen i dette eksempel. Selvom Python-fortolkeren lukker de åbnede filer automatisk i slutningen af ​​afviklingen af ​​Python-programmet, lukker man eksplicit filen via close() er en god programmeringsstil, og bør ikke glemmes.

Som en forbedring er praktisk iteratorprotokol blev introduceret i Python 2.3. Dette giver dig mulighed for at forenkle readline sløjfe:


filename = "test.txt"
for line in open(filename, 'r'):
    print(line)

I brug her er en for sløjfe i kombination med in iterator. Den aktuelle linje identificeres ved hjælp af in iterator, læses fra filen, og dens indhold udlæses til stdout. Python dækker åbning og lukning af filen for dig, når den falder uden for rækkevidde. Selvom det er ineffektivt, giver dette dig mulighed for ikke at skulle håndtere filhåndteringer længere.

Desværre er koden ovenfor mindre eksplicit og er afhængig af Pythons interne skraldesamling til at håndtere lukning af filen.

Introduceret i Python 2.5, den with kommando indkapsler hele processen endnu mere, og håndterer også åbning og lukning af filer kun én gang gennem hele kodeblokken:


filename = "test.txt"
with open(filename, 'r') as filehandle:
    for line in filehandle:
        print(line)

Kombinationen af with erklæring og open() kommando åbner kun filen én gang. Hvis det lykkes for loop udføres, og linjens indhold printes på stdout.

Desuden er brugen af with udsagn har en bivirkning. Internt opretter Python-fortolkeren en try-finally-blok for at indkapsle læsning fra filen. Det følgende eksempel viser, hvad der i bund og grund sker internt i Python med with kodeblokke:

try:
    filehandle = open(filename, 'r')
    
finally:
    filehandle.close()

Læsning af en fil som bidder af linjer

Indtil nu har vi behandlet en fil linje for linje. Dette er ret langsomt for store filer og kan forbedres ved at læse flere linjer på samme tid. For at opnå det skal islice() metode fra itertools modul kommer i spil. Det fungerer også som en iterator og returnerer en del af data, der består af n linjer. I slutningen af ​​filen kan resultatet blive kortere, og endelig vil opkaldet 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)

Læsning af en bestemt linje fra en fil

Ved at bruge metoderne vist ovenfor kan vi også udføre andre nyttige handlinger, såsom at læse en specifik linje fra en fil. For at gøre dette bruger vi en tæller og udskriver den passende linje, når vi kommer til den, mens vi gentager 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 burde være nemt at forstå, men det er lidt længere end de foregående eksempler. Den kan forkortes ved hjælp af linecache modul.

Følgende eksempel viser, hvordan man forenkler koden ved hjælp af getline() metode. Hvis det anmodede linjenummer falder uden for rækkevidden af ​​gyldige linjer i filen, så getline() metode 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)

Læsning af hele filen på én gang

Sidst, men ikke mindst, vil vi se på en meget anden sag end det foregående eksempel - at læse en hel fil på én gang.

Husk, at du i de fleste tilfælde bør have nok hukommelse til at læse hele filen, da tegn ikke fylder for meget, men er trætte af store filer. Følgende eksempel bruger en kombination af with erklæring, og read() metode. I dette tilfælde vil vi bruge read() for at indlæse filindholdet som en datastrøm:

Tjek vores praktiske, praktiske guide til at lære Git, med bedste praksis, brancheaccepterede standarder og inkluderet snydeark. Stop med at google Git-kommandoer og faktisk lærer det!


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.read()
    print (filecontent)

Python tilbyder også readlines() metode, som ligner readline() metode fra det første eksempel. I kontrast til read(), er filindholdet gemt på en liste, hvor hver linje i indholdet er et element:


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.readlines()
    for line in filecontent:
        print (line)

Mens readlines() vil læse indhold fra filen, indtil den rammer EOF, skal du huske, at du også kan begrænse mængden af ​​læst indhold ved at angive sizehint parameter, som er antallet af bytes, der skal læses.

Konklusion

Som sædvanligt er der mere end én måde at læse indholdet af en fil på. Hastighedsmæssigt er de alle mere eller mindre i samme kategori. Hvilken løsning, der fungerer bedst for dig, afhænger af din specifikke brugssituation. Vi synes, det er ret nyttigt at se, hvad der er muligt og derefter vælge den løsning, der passer bedst.

Selvom Python i høj grad forenkler processen med at læse filer, kan det til tider stadig blive vanskeligt, i hvilket tilfælde vil jeg anbefale dig at tage et kig på officiel Python-dokumentation for mere info.

Tidsstempel:

Mere fra Stablemisbrug