Cum să gestionați fișierele în Python

Manipularea fișierelor în Python: Ghid detaliat

În cadrul oricărui limbaj de programare, gestionarea fișierelor reprezintă o componentă fundamentală. Python, în mod similar, oferă suport extins pentru interacțiunea cu fișiere, permițând operații diverse precum citirea, scrierea și multe altele.

După parcurgerea acestui ghid, vei fi capabil să:

  • Deschizi și să citești fișiere folosind Python.
  • Extragi linii specifice dintr-un fișier text.
  • Scrii și adaugi conținut în fișiere.
  • Utilizezi managerii de context pentru o manipulare eficientă a fișierelor în Python.

Citirea fișierelor în Python

Pentru a iniția accesul la un fișier în Python, se utilizează sintaxa generală: open('nume_fisier', 'mod').

  • nume_fisier este, evident, denumirea fișierului pe care dorim să îl accesăm.

Notă: Dacă fișierul țintă se află în directorul de lucru curent, este suficient să specifici doar numele acestuia. În cazul în care fișierul este localizat într-un alt director, va trebui să incluzi calea completă către acesta.

  • Parametrul mod definește modul în care fișierul va fi deschis.

Modul implicit de deschidere a unui fișier este citirea, simbolizat prin litera „r”. Cu toate acestea, este o practică bună să specifici modul în mod explicit, pentru a evita ambiguitățile.

Înainte de a continua, să analizăm fișierul lib.txt, pe care îl vom folosi ca exemplu.

📁 Poți descărca fișierul text și codul utilizat în acest tutorial de la acest depozit GitHub.

Următorul fragment de cod demonstrează cum se poate deschide un fișier text, lib.txt, cu ajutorul funcției open() din Python și cum se poate afișa conținutul său:

        
file = open('lib.txt','r')
contents = file.read()
print(contents)
file.close()

# Rezultat:
# Hello, there!
# Here are a few helpful Python libraries:
# 1) NumPy
# 2) pandas
# 3) matplotlib
# 4) seaborn
# 5) scikit-learn
# 6) BeautifulSoup
# 7) Scrapy
# 8) nltk
# 9) Bokeh
# 10) statsmodels
        
    

În acest exemplu:

  • Funcția open() returnează un obiect de tip fișier, pe care îl vom denumi file.
  • Apoi, invocăm metoda read() asupra acestui obiect.
  • Variabila contents va stoca conținutul fișierului, pe care îl afișăm ulterior.
  • În cele din urmă, închidem fișierul cu file.close().

Însă, dacă uităm să închidem fișierul, putem genera o risipă de resurse. Dacă gestionăm un număr mare de fișiere, putem consuma cantități considerabile de memorie. Această situație apare deoarece menținem fișierele deschise, fără a le închide corespunzător.

Să explorăm acum o abordare mai elegantă pentru deschiderea fișierelor, folosind managerii de context. Fragmentul de cod de mai jos ilustrează utilizarea lor:

        
with open('lib.txt','r') as f:
  contents = f.read()
  print(contents)
        
    

Când folosim managerii de context, metoda close() nu mai este necesară. Fișierele sunt închise automat după ce operațiunile de I/O sunt complete.

Citirea liniilor din fișiere în Python

Fișierul text folosit ca exemplu conținea un număr mic de linii, deci citirea întregului conținut dintr-o dată nu reprezenta o problemă.

Totuși, atunci când trebuie să gestionăm fișiere de dimensiuni mari, utilizarea metodei read() nu este cea mai eficientă soluție.

În situația unui fișier text de dimensiuni foarte mari, ne putem confrunta cu epuizarea memoriei. De aceea, este util să putem citi dintr-un fișier text linie cu linie. Această secțiune prezintă cum se realizează acest lucru.

Utilizarea metodei readline() pentru citirea liniilor

Metoda readline() permite citirea unei singure linii dintr-un fișier, la fiecare apelare.

Rulează următorul cod:

        
with open('lib.txt','r') as f:
  line = f.readline()
  print(line)
  line = f.readline()
  print(line)

# Rezultat
# Hello, there!
#
# Here are a few helpful Python libraries:
        
    

După primul apel al metodei readline(), prima linie din fișier este afișată. Al doilea apel returnează a doua linie.

Acest comportament este datorat faptului că, după primul apel, indicatorul fișierului este poziționat la începutul următoarei linii.

În Python, putem folosi metoda tell() pentru a determina poziția curentă a indicatorului fișierului. Pentru a muta indicatorul într-o poziție specifică, folosim metoda seek().

În exemplul următor, folosim f.seek(0) după primul apel al metodei readline(). Aceasta mută indicatorul fișierului la începutul fișierului text. Astfel, prima linie este afișată de două ori.

        
with open('lib.txt','r') as f:
  line = f.readline()
  print(line)
  f.seek(0)
  line = f.readline()
  print(line)

# Rezultat
# Hello, there!
#
# Hello, there!
        
    

Utilizarea metodei readlines()

Există o metodă similară, numită readlines().

Rulează următorul cod. Metoda readlines() returnează o listă conținând toate liniile din fișier.

            
with open('lib.txt','r') as f:
  lines = f.readlines()
  print(lines)
            
        
            
# Rezultat
# ['Hello, there!\n', 'Here are a few helpful Python libraries:\n', 
# '1) NumPy\n', '2) pandas\n', '3) matplotlib\n', 
# '4) seaborn\n', '5) scikit-learn\n', '6) BeautifulSoup\n', 
# '7) Scrapy\n', '8) nltk\n', '9) Bokeh\n', '10) statsmodels\n', '\n']
            
        

Utilizarea buclei for pentru citirea liniilor

Pentru a parcurge liniile unui fișier text, putem folosi și o buclă for.

După obținerea unui obiect de tip fișier, putem utiliza bucla for pentru a itera prin conținutul acestuia, linie cu linie, și pentru a le afișa. Astfel, accesăm fiecare linie individual, fără a citi întregul fișier dintr-o dată.

        
with open('lib.txt','r') as f:
  for line in f:
    print(line, end='')
        
    

Notă: Funcția print() din Python adaugă implicit un caracter de linie nouă (\n) la sfârșit. Pentru a afișa conținutul fișierului exact așa cum este, fără linii noi suplimentare, vom seta argumentul end la un șir vid (end='').

Citirea fragmentată a conținutului din fișiere

Python permite, de asemenea, citirea conținutului unui fișier în fragmente de dimensiuni reduse.

Analizează următorul cod:

  • Setăm chunk_size la 50. Astfel, se vor citi primele 50 de caractere din fișier, iar apoi vor fi afișate.
  • Apoi, apelăm metoda tell() pe obiectul f. Observăm că indicatorul fișierului se află acum la poziția 51, așa cum era de așteptat.
        
chunk_size = 50
with open('lib.txt','r') as f:
  chunk = f.read(chunk_size)
  print(chunk)
  current = f.tell()
  print(f"Current position of file pointer: {current}")

# Rezultat
# Hello, there!
# Here are a few helpful Python librar
# Current position of file pointer: 51
        
    

Putem folosi această tehnică pentru a parcurge întregul fișier, fragment cu fragment.

Următorul fragment de cod demonstrează cum se face acest lucru.

            
chunk_size = 50
with open('lib.txt','r') as f:
  chunk = f.read(chunk_size)
  print(chunk,end='')

  while(len(chunk)>0):
    chunk = f.read(chunk_size)
    print(chunk,end='')

# Rezultat
# Hello, there!
# Here are a few helpful Python libraries:
# 1) NumPy
# 2) pandas
# 3) matplotlib
# 4) seaborn
# 5) scikit-learn
# 6) BeautifulSoup
# 7) Scrapy
# 8) nltk
# 9) Bokeh
# 10) statsmodels
            
        

Folosim o buclă while pentru a itera prin fișier. Citim conținutul în blocuri de 50 de caractere, până când ajungem la sfârșitul acestuia. ✅

Scrierea în fișiere în Python

Pentru a scrie într-un fișier text în Python, trebuie să îl deschidem în modul de scriere, specificând „w”.

Următorul fragment de cod ilustrează cum se face:

        
with open('new_file.txt','w') as f:
  f.write('Hello, Python!')
        
    

Vei observa că fișierul „new_file.txt” a fost creat în directorul tău de lucru.

Acum, rulează din nou același cod.

În terminal, execută următoarea comandă:

        
cat new_file.txt

# Rezultat: Hello, Python!
        
    

În mod ideal, am fi scris în fișier de două ori. Deci, textul „Hello, Python!” ar fi trebuit să apară de două ori, corect?

Însă, vedem că a fost afișat o singură dată. Motivul este că, atunci când deschidem un fișier în modul de scriere (w), suprascriem conținutul existent cu noul conținut.

Dacă dorim să adăugăm informații la sfârșitul fișierului, fără a suprascrie conținutul inițial, trebuie să deschidem fișierul în modul de adăugare. Vom analiza modul în care se face acest lucru în secțiunea următoare.

Adăugarea la fișiere în Python

Dacă dorim să adăugăm conținut la un fișier, fără a-l suprascrie, îl vom deschide în modul de adăugare.

Pentru a face acest lucru, vom folosi caracterul 'a' (de la append) și vom specifica modul explicit.

Acum, rulează următorul cod de două ori:

        
with open('new_file.txt','a') as f:
  f.write('Hello, Python!')
        
    

Observăm că textul este afișat de două ori acum, deoarece l-am adăugat la fișier.

        
cat new_file.txt

# Rezultat: Hello, Python!Hello, Python!
        
    

Concluzie

Să recapitulăm rapid elementele abordate în acest ghid:

  • Am explorat operațiunile de I/O fundamentale pentru fișiere, cum ar fi citirea, scrierea și adăugarea.
  • Am învățat să folosim metoda seek() pentru a muta indicatorul fișierului într-o poziție specifică.
  • Am folosit metoda tell() pentru a determina poziția curentă a indicatorului fișierului.

Sperăm că acest ghid ți-a fost de ajutor. Acum că știi cum să lucrezi cu fișiere text în Python, te încurajăm să explorezi manipularea fișierelor JSON în Python.

Legate de:

Verifică lungimea unei liste în Python în 3 pași.