Citirea fișierelor cu Python

Introducere

Pentru a lucra cu datele stocate, gestionarea fișierelor devine cunoștințele de bază ale fiecărui programator profesionist Python. Chiar de la prima sa lansare, atât citirea, cât și scrierea datelor în fișiere sunt caracteristici Python încorporate. În comparație cu alte limbaje de programare precum C sau Java, este destul de simplu și necesită doar câteva linii de cod. În plus, nu trebuie încărcat niciun modul suplimentar pentru a face acest lucru corect.

În acest articol, vom explica cum să citiți fișierele cu Python prin exemple. Unele exemple includ citirea unui fișier linie cu linie, ca o bucată (un număr definit de linii la un moment dat) și citirea unui fișier dintr-o singură mișcare. De asemenea, vă vom arăta o modalitate de a citi doar o anumită linie din fișier, fără a căuta în întregul fișier.

Elementele de bază ale fișierelor în Python

Metodele comune de a opera cu fișiere sunt open() pentru a deschide un fișier, seek() pentru a seta poziția curentă a fișierului la offset-ul dat și close() pentru a închide obiectul fișier când ați terminat de utilizat. Încorporat open() funcția returnează un handle de fișier care reprezintă un obiect fișier care trebuie utilizat pentru a accesa fișierul pentru citire, scriere sau adăugare.

Când deschideți un fișier pentru citire, Python trebuie să știe exact cum ar trebui să fie deschis fișierul cu sistemul. Sunt disponibile două moduri de acces - citire și citire în modul binar. Steagurile respective utilizate sunt 'r', și 'rb', și trebuie specificate la deschiderea unui fișier cu sistemul încorporat open() funcţie. Primul mod include interpretarea caracterelor speciale precum „CR” (întoarcerea căruciorului) și „LF” (linefeed) pentru a reprezenta întreruperile de linie, în timp ce modul binar vă permite să citiți datele în modul brut - unde datele sunt stocate așa cum sunt fără alte interpretări.

Odată ce ați deschis un fișier, fișierul open() funcția vă va returna un obiect fișier. Aceste obiecte fișier au metode precum read(), readline(), write(), tell(), și seek(). În timp ce unele obiecte fișier (sau obiecte asemănătoare fișierelor) au mai multe metode decât cele enumerate aici, acestea sunt cele mai comune. Nu toate obiectele fișier trebuie să implementeze toate metodele fișierului.

Citirea unui fișier linie cu linie

Primul exemplu este inspirat din cele două limbaje de programare – C și C++. Este probabil cea mai intuitivă abordare - deschideți fișierul folosind open() funcţie, citiți fișierul rând cu linie folosind readline() metoda și scoateți linia imediat după citire.

În uz aici este un while buclă care citește continuu din fișier atâta timp cât readline() metoda continuă să returneze date. În cazul în care sfârșitul fișierului (EOF) este atins while bucla se oprește și obiectul fișier este închis, eliberând resursele pentru utilizarea altor programe:


filename = "test.txt"

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


filehandle.close()

După cum probabil ați observat, în acest exemplu am deschis și închis în mod explicit fișierul. Deși interpretul Python închide automat fișierele deschise la sfârșitul execuției programului Python, închizând în mod explicit fișierul prin close() este un stil de programare bun și nu trebuie uitat.

Ca o îmbunătățire, cel protocol iterator convenabil a fost introdus în Python 2.3. Acest lucru vă permite să simplificați readline buclă:


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

În uz aici este un for buclă în combinație cu in iterator. Linia curentă este identificată cu ajutorul in iterator, citit din fișier și conținutul acestuia este scos la stdout. Python acoperă deschiderea și închiderea fișierului pentru dvs. atunci când acesta iese din domeniul de aplicare. Deși este ineficient, acest lucru vă permite să nu mai aveți de-a face cu mânerele fișierelor.

Din păcate, codul de mai sus este mai puțin explicit și se bazează pe colectarea internă a gunoiului Python pentru a gestiona închiderea fișierului.

Introdus în Python 2.5, with comanda încapsulează și mai mult întregul proces și, de asemenea, se ocupă de deschiderea și închiderea fișierelor o singură dată în întregul bloc de cod:


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

Combinația dintre with declarația și open() comanda deschide fișierul o singură dată. Dacă are succes for bucla este executată și conținutul liniei este imprimat stdout.

În plus, utilizarea with declarația are un efect secundar. Intern, interpretul Python creează un try-finally-block pentru a încapsula citirea din fișier. Următorul exemplu arată ce se întâmplă în esență intern în Python cu with blocuri de cod:

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

Citirea unui fișier ca bucăți de linii

Până acum, am procesat un fișier linie cu linie. Acest lucru este destul de lent pentru fișiere mari și poate fi îmbunătățit citind mai multe rânduri în același timp. Pentru a realiza asta, islice() metoda din iertools modulul intră în joc. De asemenea, funcționează ca un iterator și returnează o bucată de date care constă din n linii. La sfârșitul fișierului, rezultatul poate fi mai scurt și, în cele din urmă, apelul va returna o listă goală:

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)

Citirea unei linii specifice dintr-un fișier

Folosind metodele prezentate mai sus, putem efectua și alte acțiuni utile, cum ar fi citirea unei anumite linii dintr-un fișier. Pentru a face acest lucru, folosim un contor și imprimăm linia corespunzătoare atunci când ajungem la el în timp ce iterăm fișierul:


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

Acest lucru ar trebui să fie simplu de înțeles, dar este puțin mai lung decât exemplele anterioare. Poate fi scurtat folosind linecache modul.

Următorul exemplu arată cum să simplificați codul folosind getline() metodă. Dacă numărul de rând solicitat nu se încadrează în intervalul de linii valide din fișier, atunci getline() metoda returnează în schimb un șir gol:


import linecache

filename = "test.txt"

line_number = 3

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

Citirea întregului fișier dintr-o dată

Nu în ultimul rând, vom arunca o privire asupra unui caz foarte diferit față de exemplul anterior - citirea unui întreg fișier dintr-o singură mișcare.

Rețineți că, în cele mai multe cazuri, ar trebui să aveți suficientă memorie pentru a citi întregul fișier, deoarece caracterele nu ocupă prea mult spațiu, dar să fii obosit de fișiere mari. Următorul exemplu folosește o combinație a with declarația, iar read() metodă. În acest caz, vom folosi read() pentru a încărca conținutul fișierului ca flux de date:

Consultați ghidul nostru practic și practic pentru a învăța Git, cu cele mai bune practici, standarde acceptate de industrie și fisa de cheat incluse. Opriți căutarea pe Google a comenzilor Git și de fapt învăţa aceasta!


filename = "test.txt"

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

Python oferă și readlines() metoda, care este similară cu cea readline() metoda din primul exemplu. In contrast cu read(), conținutul fișierului este stocat într-o listă, în care fiecare linie a conținutului este un articol:


filename = "test.txt"

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

In timp ce readlines() va citi conținutul din fișier până când atinge EOF, rețineți că puteți limita, de asemenea, cantitatea de conținut citit, oferind sizehint parametru, care este numărul de octeți de citit.

Concluzie

Ca de obicei, există mai multe moduri de a citi conținutul unui fișier. În ceea ce privește viteza, toate sunt mai mult sau mai puțin din aceeași categorie. Ce soluție funcționează cel mai bine pentru dvs. depinde de cazul dvs. de utilizare specific. Credem că este destul de util să vedem ce este posibil și apoi să alegem soluția care se potrivește cel mai bine.

În timp ce Python simplifică foarte mult procesul de citire a fișierelor, poate deveni totuși dificil uneori, caz în care vă recomand să aruncați o privire la documentația oficială Python pentru mai multe informaţii.

Timestamp-ul:

Mai mult de la Stackabuse