Failide lugemine Pythoniga

Sissejuhatus

Salvestatud andmetega töötamiseks muutub failihaldus iga professionaalse Pythoni programmeerija põhiteadmiseks. Alates selle varaseimast väljalaskest on nii andmete lugemine kui ka failidesse kirjutamine Pythoni sisseehitatud funktsioonid. Võrreldes teiste programmeerimiskeeltega, nagu C või Java, on see üsna lihtne ja nõuab vaid mõnda koodirida. Lisaks ei pea selle nõuetekohaseks tegemiseks lisamooduleid laadima.

Selles artiklis selgitame näidete kaudu, kuidas Pythoni abil faile lugeda. Mõned näited hõlmavad faili lugemist rida-realt, tükkidena (määratud arv ridu korraga) ja faili lugemist ühe korraga. Samuti näitame teile viisi, kuidas lugeda failist ainult konkreetset rida ilma kogu failist otsimata.

Failide põhitõed Pythonis

Levinud meetodid failidega töötamiseks on open() faili avamiseks, seek() faili praeguse asukoha määramiseks antud nihkega ja close() failiobjekti sulgemiseks, kui olete selle kasutamise lõpetanud. Sisseehitatud open() Funktsioon tagastab failikäepideme, mis tähistab failiobjekti, mida kasutatakse failile lugemiseks, kirjutamiseks või lisamiseks.

Faili lugemiseks avamisel peab Python täpselt teadma, kuidas faili süsteemiga avada. Saadaval on kaks juurdepääsurežiimi – lugemine ja lugemine binaarrežiimis. Kasutatud vastavad lipud on 'r'ja 'rb', ja need tuleb sisseehitatud failiga faili avamisel täpsustada open() funktsiooni. Esimene režiim sisaldab reavahede tähistamiseks erimärkide, nagu "CR" (carriage return) ja "LF" (reavahetus) tõlgendamist, samas kui binaarrežiim võimaldab teil lugeda andmeid töötlemata režiimis – kus andmed salvestatakse nii nagu need on. ilma edasise tõlgendamiseta.

Kui olete faili avanud, open() funktsioon tagastab teile failiobjekti. Nendel failiobjektidel on sellised meetodid nagu read(), readline(), write(), tell()ja seek(). Kuigi mõnel failiobjektil (või failisarnastel objektil) on rohkem meetodeid kui siin loetletud, on need kõige levinumad. Kõik failiobjektid ei pea rakendama kõiki failimeetodeid.

Faili lugemine rida-realt

Esimene näide on inspireeritud kahest programmeerimiskeelest – C ja C++. See on ilmselt kõige intuitiivsem lähenemine – avage fail kasutades open() funktsioon loe faili rida-realt kasutades readline() meetodil ja väljastada rida kohe pärast lugemist.

Siin on kasutusel a while tsükkel, mis loeb failist pidevalt nii kaua kui readline() meetod tagastab pidevalt andmeid. Kui faili lõpp (EOF) on saavutatud while tsükkel peatub ja failiobjekt suletakse, vabastades ressursid teistele programmidele kasutamiseks:


filename = "test.txt"

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


filehandle.close()

Nagu olete võib-olla märkinud, oleme selles näites faili selgesõnaliselt avanud ja sulgenud. Kuigi Pythoni tõlk sulgeb Pythoni programmi täitmise lõpus avatud failid automaatselt, sulgedes faili selgesõnaliselt close() on hea programmeerimisstiil ja seda ei tohiks unustada.

Parandusena on mugav iteraatori protokoll võeti kasutusele Python 2.3-s. See võimaldab teil lihtsustada readline silmus:


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

Siin on kasutusel a for silmus kombinatsioonis in iteraator. Praegune rida tuvastatakse abiga in iteraator, loeb failist välja ja selle sisu väljastatakse stdout. Python katab teie eest faili avamise ja sulgemise, kui see jääb kohaldamisalast välja. Kuigi see on ebaefektiivne, ei pea te enam failikäepidemetega tegelema.

Kahjuks on ülaltoodud kood vähem selge ja tugineb faili sulgemisel Pythoni sisemisele prügikogumisele.

Python 2.5-s kasutusele võetud with käsk kapseldab kogu protsessi veelgi ning käsitleb ka failide avamist ja sulgemist ainult üks kord kogu ulatusega koodiploki ulatuses:


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

Kombinatsioon with avaldus ja open() käsk avab faili ainult üks kord. Edu korral for loop käivitatakse ja rea ​​sisu prinditakse stdout.

Peale selle kasutamine with avaldusel on kõrvalmõju. Sisemiselt loob Pythoni tõlk a try-finally-plokk failist lugemise kapseldamiseks. Järgmine näide näitab, mis Pythonis sisemiselt toimub with koodiplokid:

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

Faili lugemine ridade tükkidena

Siiani oleme faili ridade kaupa töötlenud. See on suurte failide puhul üsna aeglane ja seda saab parandada, lugedes korraga mitut rida. Selle saavutamiseks on islice() meetodist itertitööriistad moodul tuleb mängu. Lisaks toimib see iteraatorina ja tagastab hulga andmeid, millest koosneb n read. Faili lõpus võib tulemus olla lühem ja lõpuks tagastab kõne tühja loendi:

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)

Konkreetse rea lugemine failist

Kasutades ülaltoodud meetodeid, saame teha ka muid kasulikke toiminguid, näiteks lugeda failist konkreetset rida. Selleks kasutame loendurit ja prindime faili itereerimisel vastava rea, kui jõuame selleni:


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

Seda peaks olema lihtne mõista, kuid see on veidi pikem kui eelmistes näidetes. Seda saab lühendada kasutades vahemälu moodul.

Järgmine näide näitab, kuidas koodi lihtsustada kasutades getline() meetod. Kui taotletud reanumber jääb faili kehtivate ridade vahemikust välja, siis getline() meetod tagastab selle asemel tühja stringi:


import linecache

filename = "test.txt"

line_number = 3

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

Kogu faili korraga lugemine

Viimaseks, kuid mitte vähemtähtsaks, vaatame eelmisest näitest väga erinevat juhtumit – terve faili ühe korraga lugemist.

Pidage meeles, et enamikul juhtudel peaks teil kogu faili lugemiseks olema piisavalt mälu, kuna märgid ei võta liiga palju ruumi, kuid on suurtest failidest tüdinenud. Järgmises näites kasutatakse kombinatsiooni with avaldus ja read() meetod. Sel juhul kasutame read() faili sisu andmevoona laadimiseks:

Tutvuge meie praktilise ja praktilise Giti õppimise juhendiga, mis sisaldab parimaid tavasid, tööstusharus aktsepteeritud standardeid ja kaasas olevat petulehte. Lõpetage Giti käskude guugeldamine ja tegelikult õppima seda!


filename = "test.txt"

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

Python pakub ka readlines() meetodiga, mis on sarnane readline() meetod esimesest näitest. Vastupidiselt sellele read(), salvestatakse faili sisu loendisse, kus iga sisu rida on üksus:


filename = "test.txt"

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

Kui readlines() loeb failist sisu, kuni see jõuab EOF-i, pidage meeles, et saate piirata ka loetava sisu hulka, esitades sizehint parameeter, mis on loetavate baitide arv.

Järeldus

Nagu tavaliselt, on faili sisu lugemiseks rohkem kui üks viis. Kiiruse poolest on kõik enam-vähem samas kategoorias. Milline lahendus teile kõige paremini sobib, sõltub teie konkreetsest kasutusjuhtumist. Meie arvates on väga kasulik vaadata, mis on võimalik, ja seejärel valida kõige sobivam lahendus.

Kuigi Python lihtsustab oluliselt failide lugemist, võib see mõnikord siiski keeruliseks muutuda. Sel juhul soovitan teil vaadata ametlik Pythoni dokumentatsioon rohkem infot.

Ajatempel:

Veel alates Stackabus