Een generator schrijven om data in chunks te laden (2)
In de vorige oefening heb je een bestand regel voor regel verwerkt voor een vastgesteld aantal regels. Maar wat als je dit voor het hele bestand wilt doen?
In dat geval is het handig om generators te gebruiken. Met generators kun je data lui evalueren. Dit concept van lui evalueren is nuttig bij zeer grote gegevenssets, omdat je zo waarden efficiënt kunt genereren door telkens slechts stukjes data te yielden in plaats van alles in één keer.
In deze oefening definieer je een generatorfunctie read_large_file() die een generatorobject oplevert dat elke keer dat je next() aanroept één regel uit een bestand yieldt. Het csv-bestand 'world_dev_ind.csv' staat in je huidige map.
Let op: als je een bestand opent, is het resulterende bestandsobject al een generator! In de praktijk hoef je in dit soort gevallen dus niet expliciet generatorobjecten te maken. Voor de leerervaring laten we je hier echter oefenen met de functie read_large_file(). Succes!
Deze oefening maakt deel uit van de cursus
Python-gereedschapskist
Oefeninstructies
- Lees in de functie
read_large_file()één regel uitfile_objectmet de methodereadline(). Wijs het resultaat toe aandata. yieldin de functieread_large_file()de uit het bestand gelezen regeldata.- Maak in de contextmanager een generatorobject
gen_filedoor je generatorfunctieread_large_file()aan te roepen enfiledoor te geven. - Print de eerste drie regels die het generatorobject
gen_fileoplevert metnext().
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
# 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(____)