Scrivere un generatore per caricare i dati in blocchi (2)
Nell'esercizio precedente hai lavorato su un file riga per riga per un certo numero di righe. E se invece volessi farlo per tutto il file?
In questo caso, sarebbe utile usare dei generatori. I generatori permettono agli utenti di valutare in modo pigro i dati. Questo concetto di valutazione pigra è utile quando si ha a che fare con set di dati molto grandi, perché consente di generare valori in modo efficiente, producendo solo porzioni di dati alla volta invece che l'intero set in una sola volta.
In questo esercizio, definirai una funzione generatrice read_large_file() che crea un oggetto generatore che restituisce una singola riga da un file ogni volta che viene chiamato next(). Il file csv 'world_dev_ind.csv' è nella tua cartella attuale, pronto per essere usato.
Tieni presente che quando apri una connessione a un file, l'oggetto file che ne risulta è già un generatore! Quindi, in pratica, non dovrai creare esplicitamente oggetti generatori in casi come questo. Comunque, per motivi didattici, ti facciamo fare pratica su come farlo qui con la funzione read_large_file(). Dai, buttati!
Questo esercizio fa parte del corso
Strumenti per Python
Istruzioni dell'esercizio
- Nella funzione
read_large_file(), leggi una riga dafile_objectusando il metodoreadline(). Assegna il risultato adata. - Nella funzione
read_large_file(),yieldla riga viene letta dal filedata. - Nel context manager, crea un oggetto generatore
gen_filechiamando la tua funzione generatriceread_large_file()e passandocifile. - Stampa le prime tre righe generate dall'oggetto generatore
gen_fileusandonext().
Esercizio pratico interattivo
Prova a risolvere questo esercizio completando il codice di esempio.
# Define read_large_file()
def read_large_file(file_object):
"""A generator function to read a large file lazily."""
# Loop indefinitely until the end of the file
while True:
# Read a line from the file: data
data = ____
# Break if this is the end of the file
if not data:
break
# Yield the line of data
# Open a connection to the file
with open('world_dev_ind.csv') as file:
# Create a generator object for the file: gen_file
gen_file = ____
# Print the first three lines of the file
print(____)
print(____)
print(____)