Tiedostojen lukeminen Pythonilla

esittely

Tallennettujen tietojen käsittelyssä tiedostojen käsittelystä tulee jokaisen ammattimaisen Python-ohjelmoijan ydinosaamista. Heti ensimmäisestä julkaisustaan ​​lähtien sekä tietojen lukeminen että kirjoittaminen tiedostoihin ovat sisäänrakennettuja Python-ominaisuuksia. Verrattuna muihin ohjelmointikieliin, kuten C tai Java, se on melko yksinkertainen ja vaatii vain muutaman rivin koodia. Lisäksi mitään ylimääräistä moduulia ei tarvitse ladata tehdäkseen sen oikein.

Tässä artikkelissa selitämme tiedostojen lukemisen Pythonilla esimerkkien avulla. Joitakin esimerkkejä ovat tiedoston lukeminen rivi riviltä, ​​kappaleena (määritetty määrä rivejä kerrallaan) ja tiedoston lukeminen yhdellä kertaa. Näytämme myös tavan lukea tiedostosta vain tietty rivi ilman koko tiedostoa hakemista.

Pythonin tiedostojen perusteet

Yleisimmät menetelmät tiedostojen käsittelyyn ovat open() avata tiedosto, seek() asettaaksesi tiedoston nykyisen sijainnin annetulla siirtymällä, ja close() sulkeaksesi tiedostoobjektin, kun olet lopettanut sen käytön. Sisäänrakennettu open() funktio palauttaa tiedostokahvan, joka edustaa tiedostoobjektia, jota käytetään tiedoston käyttämiseen lukemista, kirjoittamista tai liittämistä varten.

Kun tiedostoa avataan lukemista varten, Pythonin on tiedettävä tarkalleen, kuinka tiedosto tulee avata järjestelmässä. Käytettävissä on kaksi käyttötilaa – lukeminen ja lukeminen binääritilassa. Käytetyt vastaavat liput ovat 'r'ja 'rb', ja ne on määritettävä avattaessa tiedosto sisäänrakennetulla sovelluksella open() toiminto. Ensimmäinen tila sisältää erikoismerkkien, kuten "CR" (carriage return) ja "LF" (rivinvaihto) tulkinnan esittämään rivinvaihtoja, kun taas binääritilassa voit lukea tietoja raakatilassa – jossa tiedot tallennetaan sellaisenaan. ilman sen kummempaa tulkintaa.

Kun olet avannut tiedoston, open() toiminto palauttaa sinulle tiedostoobjektin. Näillä tiedostoobjekteilla on menetelmiä, kuten read(), readline(), write(), tell()ja seek(). Vaikka joillakin tiedostoobjekteilla (tai tiedostomaisilla objekteilla) on enemmän menetelmiä kuin tässä luetellut, nämä ovat yleisimpiä. Kaikkien tiedostoobjektien ei tarvitse toteuttaa kaikkia tiedostomenetelmiä.

Tiedoston lukeminen rivi riviltä

Ensimmäinen esimerkki on saanut inspiraationsa kahdesta ohjelmointikielestä – C ja C++. Se on luultavasti intuitiivisin tapa – avaa tiedosto käyttämällä open() toiminto, lue tiedosto rivi riviltä käyttäen readline() menetelmällä ja tulosta rivi välittömästi lukemisen jälkeen.

Tässä käytössä on a while silmukka, joka lukee jatkuvasti tiedostosta niin kauan kuin readline() menetelmä palauttaa jatkuvasti tietoja. Jos tiedoston loppu (EOF) saavutetaan while silmukka pysähtyy ja tiedostoobjekti suljetaan, mikä vapauttaa resursseja muiden ohjelmien käyttöön:


filename = "test.txt"

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


filehandle.close()

Kuten olet ehkä huomannut, olemme nimenomaisesti avannut ja sulkenut tiedoston tässä esimerkissä. Vaikka Python-tulkki sulkee avatut tiedostot automaattisesti Python-ohjelman suorituksen lopussa, sulkee tiedoston nimenomaisesti close() on hyvä ohjelmointityyli, eikä sitä pidä unohtaa.

Parannuksena, kätevä iteraattoriprotokolla otettiin käyttöön Python 2.3:ssa. Tämän avulla voit yksinkertaistaa readline silmukka:


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

Tässä käytössä on a for silmukka yhdessä in iteraattori. Nykyinen linja tunnistetaan in iteraattori, lue tiedostosta ja sen sisältö tulostetaan stdout. Python kattaa tiedoston avaamisen ja sulkemisen puolestasi, kun se ei kuulu soveltamisalaan. Vaikka tämä on tehotonta, sinun ei tarvitse enää käsitellä tiedostokahvoja.

Valitettavasti yllä oleva koodi on vähemmän yksiselitteinen ja luottaa Pythonin sisäiseen roskienkeräukseen tiedoston sulkemisen käsittelyssä.

Python 2.5:ssä esitelty with komento kapseloi koko prosessin entisestään ja käsittelee myös tiedostojen avaamisen ja sulkemisen vain kerran koko suojatun koodilohkon ajan:


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

Yhdistelmä with lausunto ja open() komento avaa tiedoston vain kerran. Jos onnistuu, for silmukka suoritetaan ja rivin sisältö tulostetaan stdout.

Lisäksi käyttö with lausunnolla on sivuvaikutus. Sisäisesti Python-tulkki luo a try-finally-block kapseloidaksesi lukemisen tiedostosta. Seuraava esimerkki näyttää, mitä käytännössä tapahtuu sisäisesti Pythonissa with koodilohkot:

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

Tiedoston lukeminen rivinä

Tähän mennessä olemme käsitelleet tiedoston rivi riviltä. Tämä on melko hidasta suurille tiedostoille, ja sitä voidaan parantaa lukemalla useita rivejä samanaikaisesti. Sen saavuttamiseksi islice() menetelmä itert-työkalut moduuli tulee peliin. Se toimii myös iteraattorina ja palauttaa osan dataa, joka koostuu n rivit. Tiedoston lopussa tulos saattaa olla lyhyempi, ja lopuksi puhelu palauttaa tyhjän listan:

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)

Tietyn rivin lukeminen tiedostosta

Yllä esitettyjen menetelmien avulla voimme suorittaa myös muita hyödyllisiä toimintoja, kuten lukea tietyn rivin tiedostosta. Käytämme tätä varten laskuria ja tulostamme oikean rivin, kun tulemme siihen, kun iteroitamme tiedostoa:


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

Tämän pitäisi olla helppo ymmärtää, mutta se on hieman pidempi kuin aiemmat esimerkit. Sitä voidaan lyhentää käyttämällä linecache moduuli.

Seuraava esimerkki näyttää kuinka yksinkertaistaa koodia käyttämällä getline() menetelmä. Jos pyydetty rivinumero jää tiedoston kelvollisten rivien alueen ulkopuolelle, getline() Metodi palauttaa sen sijaan tyhjän merkkijonon:


import linecache

filename = "test.txt"

line_number = 3

line = linecache.getline(filename, line_number)
print (f"line {line_number} of {filename}:")
print (line)

Koko tiedoston lukeminen kerralla

Viimeisenä mutta ei vähäisimpänä tarkastelemme hyvin erilaista tapausta kuin edellinen esimerkki – koko tiedoston lukeminen yhdellä kertaa.

Muista, että useimmissa tapauksissa sinulla pitäisi olla tarpeeksi muistia koko tiedoston lukemiseen, koska merkit eivät vie liikaa tilaa, mutta ovat väsyneitä suuriin tiedostoihin. Seuraava esimerkki käyttää yhdistelmää with lausunto ja read() menetelmä. Tässä tapauksessa käytämme read() ladataksesi tiedoston sisällön tietovirtana:

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!


filename = "test.txt"

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

Python tarjoaa myös readlines() menetelmä, joka on samanlainen kuin readline() menetelmä ensimmäisestä esimerkistä. Toisin kuin read(), tiedoston sisältö tallennetaan luetteloon, jossa jokainen sisällön rivi on kohde:


filename = "test.txt"

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

Vaikka readlines() lukee tiedoston sisältöä, kunnes se saavuttaa EOF:n. Muista, että voit myös rajoittaa luettavan sisällön määrää antamalla sizehint parametri, joka on luettavien tavujen määrä.

Yhteenveto

Kuten tavallista, on olemassa useampi kuin yksi tapa lukea tiedoston sisältö. Nopeudella ne kaikki ovat enemmän tai vähemmän samassa kategoriassa. Se, mikä ratkaisu sopii sinulle parhaiten, riippuu käyttötapauksestasi. Mielestämme on hyödyllistä nähdä, mikä on mahdollista, ja sitten valita sopivin ratkaisu.

Vaikka Python yksinkertaistaa huomattavasti tiedostojen lukemisprosessia, siitä voi silti tulla toisinaan hankalaa, jolloin suosittelen, että katsot virallinen Python-dokumentaatio lisätietoja.

Aikaleima:

Lisää aiheesta Stackabus