Escritura de un generador para cargar datos en fragmentos (2)
En el ejercicio anterior, procesaste un número determinado de líneas en un archivo línea por línea. Pero ¿y si quieres hacerlo en todo el archivo?
En este caso, sería útil utilizar generadores. Los generadores permiten a los usuarios evaluar perezosamente los datos. Este concepto de evaluación perezosa es útil cuando tienes que tratar con conjuntos de datos muy grandes, porque te permite generar valores de forma eficiente produciendo solo fragmentos de datos cada vez, y no todo junto.
En este ejercicio, definirás la función de generador read_large_file()
, que crea un objeto generador que produce una única línea a partir de un archivo cada vez que se llama a next()
en él. El archivo .csv 'world_dev_ind.csv'
está en tu directorio actual para que lo utilices.
Ten en cuenta que, cuando abres una conexión a un archivo, el objeto archivo resultante ya es un generador. Así que, en el mundo real, no tendrás que crear explícitamente objetos generadores en casos como este. Sin embargo, por razones pedagógicas, aquí te hacemos practicar cómo hacerlo con la función read_large_file()
. ¡A por ello!
Este ejercicio forma parte del curso
Caja de herramientas Python
Instrucciones de ejercicio
- En la función
read_large_file()
, lee una línea defile_object
utilizando el métodoreadline()
. Asigna el resultado a . - En la función
read_large_file()
, aplicayield
a la línea leída del archivodata
. - En el gestor de contexto, crea un objeto generador
gen_file
llamando a tu función de generadoraread_large_file()
y pasándolefile
. - Imprime las tres primeras líneas producidas por el objeto generador
gen_file
utilizandonext()
.
Ejercicio interactivo práctico
Pruebe este ejercicio completando este código de muestra.
# 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(____)