Lettura di file con Python

Introduzione

Per lavorare con i dati archiviati, la gestione dei file diventa la conoscenza fondamentale di ogni programmatore Python professionista. Fin dalla sua prima versione, sia la lettura che la scrittura dei dati sui file sono funzionalità integrate di Python. Rispetto ad altri linguaggi di programmazione come C o Java, è piuttosto semplice e richiede solo poche righe di codice. Inoltre, per farlo correttamente non è necessario caricare alcun modulo aggiuntivo.

In questo articolo spiegheremo come leggere file con Python attraverso degli esempi. Alcuni esempi includono la lettura di un file riga per riga, come un pezzo (un numero definito di righe alla volta) e la lettura di un file in una volta sola. Inoltre, ti mostreremo un modo per leggere solo una riga specifica dal file, senza cercare nell'intero file.

Nozioni di base sui file in Python

I metodi comuni per operare con i file sono open() per aprire un file, seek() per impostare la posizione corrente del file all'offset specificato e close() per chiudere l'oggetto file quando hai finito di usarlo. L'integrato open() La funzione restituisce un handle di file che rappresenta un oggetto file da utilizzare per accedere al file per la lettura, la scrittura o l'aggiunta.

Quando si apre un file per la lettura, Python deve sapere esattamente come il file dovrebbe essere aperto con il sistema. Sono disponibili due modalità di accesso: lettura e lettura in modalità binaria. I rispettivi flag utilizzati sono 'r'e 'rb', e devono essere specificati quando si apre un file con il built-in open() funzione. La prima modalità include l'interpretazione di caratteri speciali come "CR" (ritorno a capo) e "LF" (avanzamento riga) per rappresentare interruzioni di riga, mentre la modalità binaria consente di leggere i dati in modalità grezza, dove i dati vengono archiviati così come sono senza ulteriore interpretazione.

Una volta aperto un file, il file open() la funzione ti restituirà un oggetto file. Questi oggetti file hanno metodi come read(), readline(), write(), tell()e seek(). Sebbene alcuni oggetti file (o oggetti simili a file) dispongano di più metodi di quelli elencati qui, questi sono i più comuni. Non tutti gli oggetti file devono implementare tutti i metodi file.

Leggere un file riga per riga

Il primo esempio è ispirato ai due linguaggi di programmazione: C e C++. È probabilmente l'approccio più intuitivo: aprire il file utilizzando il file open() funzione, leggere il file riga per riga usando il readline() metodo e visualizza la riga immediatamente dopo la lettura.

In uso ecco a while ciclo che legge continuamente dal file finché il file readline() il metodo continua a restituire dati. Nel caso in cui venga raggiunta la fine del file (EOF), il file while il ciclo si interrompe e l'oggetto file viene chiuso, liberando le risorse che possono essere utilizzate da altri programmi:


filename = "test.txt"

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


filehandle.close()

Come avrai notato, in questo esempio abbiamo aperto e chiuso esplicitamente il file. Sebbene l'interprete Python chiuda automaticamente i file aperti al termine dell'esecuzione del programma Python, chiudendo esplicitamente il file tramite close() è uno stile di programmazione valido e non dovrebbe essere dimenticato.

Come miglioramento, il protocollo iteratore conveniente è stato introdotto in Python 2.3. Ciò consente di semplificare il readline ciclo:


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

In uso ecco a for loop in combinazione con il in iteratore. La linea attuale viene identificata con l'aiuto di in iteratore, letto dal file e il suo contenuto viene inviato in output stdout. Python copre l'apertura e la chiusura del file quando non rientra nell'ambito. Sebbene inefficiente, ciò ti consente di non dover più occuparti degli handle di file.

Sfortunatamente, il codice sopra è meno esplicito e si basa sulla garbage collection interna di Python per gestire la chiusura del file.

Introdotto in Python 2.5, il with Il comando incapsula ancora di più l'intero processo e gestisce anche l'apertura e la chiusura dei file una sola volta in tutto il blocco di codice con ambito:


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

La combinazione del with dichiarazione e il open() il comando apre il file solo una volta. In caso di successo il for viene eseguito il ciclo e viene stampato il contenuto della riga stdout.

Inoltre, l'utilizzo di with l'affermazione ha un effetto collaterale. Internamente, l'interprete Python crea un file try-finally-block per incapsulare la lettura dal file. L'esempio seguente mostra cosa sta essenzialmente accadendo internamente in Python con il file with blocchi di codice:

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

Lettura di un file come blocchi di righe

Finora abbiamo elaborato un file riga per riga. Questo è piuttosto lento per file di grandi dimensioni e può essere migliorato leggendo più righe contemporaneamente. Per raggiungere questo obiettivo, il islice() metodo dal itertools entra in gioco il modulo Inoltre, funziona come un iteratore e restituisce una porzione di dati composta da n linee. Alla fine del file, il risultato potrebbe essere più breve e, infine, la chiamata restituirà un elenco vuoto:

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)

Lettura di una riga specifica da un file

Utilizzando i metodi mostrati sopra possiamo anche eseguire altre azioni utili, come leggere una riga specifica da un file. Per fare ciò, utilizziamo un contatore e stampiamo la riga appropriata quando ci arriviamo durante l'iterazione del file:


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

Dovrebbe essere semplice da capire, ma è un po' più lungo degli esempi precedenti. Può essere abbreviato utilizzando il linecache modulo.

L'esempio seguente mostra come semplificare il codice utilizzando il metodo getline() metodo. Se il numero di riga richiesto non rientra nell'intervallo di righe valide nel file, il file getline() Il metodo restituisce invece una stringa vuota:


import linecache

filename = "test.txt"

line_number = 3

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

Leggere l'intero file in una volta

Ultimo ma non meno importante, esamineremo un caso molto diverso rispetto all'esempio precedente: leggere un intero file in una volta sola.

Tieni presente che nella maggior parte dei casi dovresti avere memoria sufficiente per leggere l'intero file, poiché i caratteri non occupano troppo spazio, ma stancati dei file di grandi dimensioni. L'esempio seguente utilizza una combinazione di with dichiarazione, e il read() metodo. In questo caso, useremo read() per caricare il contenuto del file come flusso di dati:

Dai un'occhiata alla nostra guida pratica e pratica per l'apprendimento di Git, con le migliori pratiche, gli standard accettati dal settore e il cheat sheet incluso. Smetti di cercare su Google i comandi Git e in realtà imparare esso!


filename = "test.txt"

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

Python offre anche il readlines() metodo, che è simile al readline() metodo dal primo esempio. In contrasto con read(), il contenuto del file viene memorizzato in un elenco, in cui ogni riga del contenuto è un elemento:


filename = "test.txt"

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

Mentre readlines() leggerà il contenuto dal file finché non raggiunge EOF, tieni presente che puoi anche limitare la quantità di contenuto letto fornendo il sizehint parametro, che è il numero di byte da leggere.

Conclusione

Come al solito, esiste più di un modo per leggere il contenuto di un file. In termini di velocità, rientrano tutti più o meno nella stessa categoria. La soluzione più adatta a te dipende dal tuo caso d'uso specifico. Pensiamo che sia molto utile vedere cosa è possibile fare e poi scegliere la soluzione più adatta.

Sebbene Python semplifichi notevolmente il processo di lettura dei file, a volte può comunque diventare complicato, nel qual caso ti consiglio di dare un'occhiata al documentazione ufficiale di Python per maggiori informazioni.

Timestamp:

Di più da Impilamento