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() to set the file’s current position at the given offset, and close() to close the file object when you’re done using it. The built-in open() Funktsioon tagastab failikäepideme, mis tähistab failiobjekti, mida kasutatakse failile lugemiseks, kirjutamiseks või lisamiseks.

When opening a file for reading, Python needs to know exactly how the file should be opened with the system. Two access modes are available – reading and reading in binary mode. The respective flags used are 'r'ja 'rb', ja need tuleb sisseehitatud failiga faili avamisel täpsustada open() function. The first mode includes the interpretation of special characters like “CR” (carriage return) and “LF” (linefeed) to represent line breaks, whereas the binary mode allows you to read the data in raw mode – where the data is stored as is without further interpretation.

Once you’ve opened a file, the 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

The first example is inspired by the two programming languages – C and C++. It is probably the most intuitive approach – open the file using the 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.

Unfortunately, the code above is less explicit and relies on Python’s internal garbage collection to handle closing the file.

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

This should be simple to understand, but it’s a bit longer than the previous examples. It can be shortened using the 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

Last but not least we will have a look at a very different case than the previous example – reading an entire file in one go.

Keep in mind that in most cases you should have enough memory to read the entire file, since characters don’t take up too much space, but be weary of large files. The following example uses a combination of the with avaldus ja read() method. In this case, we’ll use 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.

While Python greatly simplifies the process of reading files, it can still become tricky at times, in which case I’d recommend you take a look at the ametlik Pythoni dokumentatsioon rohkem infot.

Ajatempel:

Veel alates Stackabus