Branje datotek s Pythonom

Predstavitev

Za delo s shranjenimi podatki postane upravljanje datotek temeljno znanje vsakega profesionalnega programerja Python. Že od prve izdaje sta branje in pisanje podatkov v datoteke vgrajeni funkciji Python. V primerjavi z drugimi programskimi jeziki, kot sta C ali Java, je precej preprost in zahteva le nekaj vrstic kode. Poleg tega za pravilno izvedbo ni treba naložiti dodatnega modula.

V tem članku bomo na primerih razložili, kako brati datoteke s Pythonom. Nekateri primeri vključujejo branje datoteke vrstico za vrstico, kot kos (določeno število vrstic hkrati) in branje datoteke naenkrat. Pokazali vam bomo tudi način, kako prebrati samo določeno vrstico iz datoteke, brez iskanja po celotni datoteki.

Osnove datotek v Pythonu

Običajne metode za delo z datotekami so open() odpreti datoteko, seek() da nastavite trenutni položaj datoteke pri danem odmiku in close() da zaprete predmet datoteke, ko ga nehate uporabljati. Vgrajeni open() funkcija vrne ročico datoteke, ki predstavlja predmet datoteke, ki se uporablja za dostop do datoteke za branje, pisanje ali dodajanje.

Pri odpiranju datoteke za branje mora Python natančno vedeti, kako naj se datoteka odpre s sistemom. Na voljo sta dva načina dostopa – branje in branje v binarnem načinu. Uporabljene zastave so 'r'in 'rb', in jih je treba določiti, ko odprete datoteko z vgrajenim open() funkcijo. Prvi način vključuje interpretacijo posebnih znakov, kot sta »CR« (povratek na začetek vrstice) in »LF« (pomik vrstice), ki predstavljajo prelome vrstic, medtem ko vam binarni način omogoča branje podatkov v surovem načinu – kjer so podatki shranjeni, kot so brez nadaljnje interpretacije.

Ko odprete datoteko, se open() funkcija vam bo vrnila predmet datoteke. Ti predmeti datoteke imajo metode, kot so read(), readline(), write(), tell()in seek(). Medtem ko imajo nekateri datotečni objekti (ali datotekam podobni objekti) več metod kot tukaj naštete, so te najpogostejše. Vsem datotečnim objektom ni treba izvajati vseh datotečnih metod.

Branje datoteke vrstico za vrstico

Prvi primer se zgleduje po dveh programskih jezikih – C in C++. To je verjetno najbolj intuitiven pristop – odprite datoteko z open() funkcijo, preberite datoteko vrstico za vrstico uporabi readline() in izpiše vrstico takoj po branju.

Tukaj je v uporabi a while zanke, ki neprekinjeno bere iz datoteke, dokler je readline() metoda še naprej vrača podatke. V primeru, da je dosežen konec datoteke (EOF). while zanka se ustavi in ​​datotečni objekt se zapre, s čimer se sprostijo viri za uporabo drugih programov:


filename = "test.txt"

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


filehandle.close()

Kot ste morda opazili, smo v tem primeru izrecno odprli in zaprli datoteko. Čeprav tolmač Python samodejno zapre odprte datoteke ob koncu izvajanja programa Python, eksplicitno zapre datoteko prek close() je dober stil programiranja in ga ne smemo pozabiti.

Kot izboljšava je priročen protokol iteratorja je bil predstavljen v Pythonu 2.3. To vam omogoča poenostavitev readline zanka:


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

Tukaj je v uporabi a for zanko v kombinaciji z in iterator. Trenutna linija je identificirana s pomočjo in iterator, prebere iz datoteke in njena vsebina se izpiše v stdout. Python pokriva odpiranje in zapiranje datoteke namesto vas, ko ta pade iz obsega. Čeprav je neučinkovito, vam to omogoča, da se vam ni treba več ukvarjati z ročaji datotek.

Na žalost je zgornja koda manj eksplicitna in se pri zapiranju datoteke zanaša na Pythonovo notranje zbiranje smeti.

Predstavljen v Pythonu 2.5, je with ukaz celoten postopek še bolj zaokroži in prav tako obravnava odpiranje in zapiranje datotek samo enkrat v celotnem bloku kode v obsegu:


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

Kombinacija with izjava in open() ukaz odpre datoteko samo enkrat. Če je uspešno, for zanka se izvede in vsebina vrstice se natisne stdout.

Poleg tega je uporaba with izjava ima stranski učinek. Interno tolmač Python ustvari a try-finally-blok za enkapsulacijo branja iz datoteke. Naslednji primer prikazuje, kaj se v bistvu dogaja znotraj Pythona z with kodni bloki:

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

Branje datoteke kot kosov vrstic

Do sedaj smo obdelali datoteko vrstico za vrstico. To je precej počasno za velike datoteke in se lahko izboljša z branjem več vrstic hkrati. Da bi to dosegli, islice() metoda iz itertools modul pride v poštev. Deluje tudi kot iterator in vrne kos podatkov, ki so sestavljeni iz n vrstice. Na koncu datoteke je lahko rezultat krajši in končno bo klic vrnil prazen seznam:

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)

Branje določene vrstice iz datoteke

Z zgoraj prikazanimi metodami lahko izvedemo tudi druga uporabna dejanja, kot je branje določene vrstice iz datoteke. Za to uporabimo števec in natisnemo ustrezno vrstico, ko pridemo do njega med ponavljanjem po datoteki:


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

To bi moralo biti preprosto za razumevanje, vendar je nekoliko daljše od prejšnjih primerov. Lahko se skrajša z uporabo linecache modul.

Naslednji primer prikazuje, kako poenostaviti kodo z uporabo getline() metoda. Če zahtevana številka vrstice pade iz obsega veljavnih vrstic v datoteki, potem je getline() namesto tega metoda vrne prazen niz:


import linecache

filename = "test.txt"

line_number = 3

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

Branje celotne datoteke naenkrat

Nenazadnje si bomo ogledali zelo drugačen primer kot prejšnji primer – branje celotne datoteke naenkrat.

Ne pozabite, da bi morali v večini primerov imeti dovolj pomnilnika za branje celotne datoteke, saj znaki ne zavzamejo preveč prostora, vendar bodite utrujeni od velikih datotek. V naslednjem primeru je uporabljena kombinacija with izjavo in read() metoda. V tem primeru bomo uporabili read() da naložite vsebino datoteke kot podatkovni tok:

Oglejte si naš praktični, praktični vodnik za učenje Gita z najboljšimi praksami, standardi, sprejetimi v panogi, in priloženo goljufijo. Nehajte Googlati ukaze Git in pravzaprav naučiti it!


filename = "test.txt"

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

Python ponuja tudi readlines() metoda, ki je podobna readline() metoda iz prvega primera. Za razliko od read(), je vsebina datoteke shranjena na seznamu, kjer je vsaka vrstica vsebine postavka:


filename = "test.txt"

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

Medtem ko je readlines() bo prebral vsebino iz datoteke, dokler ne doseže EOF, ne pozabite, da lahko tudi omejite količino prebrane vsebine, tako da zagotovite sizehint parameter, ki je število bajtov za branje.

zaključek

Kot običajno obstaja več kot en način za branje vsebine datoteke. Po hitrosti so vsi bolj ali manj v istem razredu. Katera rešitev vam najbolj ustreza, je odvisno od vašega konkretnega primera uporabe. Menimo, da je zelo koristno videti, kaj je mogoče, in nato izbrati rešitev, ki je najboljša.

Medtem ko Python močno poenostavi postopek branja datotek, lahko včasih še vedno postane težavno, v tem primeru vam priporočam, da si ogledate uradna dokumentacija Python za več informacij.

Časovni žig:

Več od Stackabuse