Psaní generátoru pro načítání dat po částech (2)
V předchozím cvičení jsi zpracoval/a soubor řádek po řádku pro zadaný počet řádků. Co kdybys ale chtěl/a zpracovat celý soubor?
V takovém případě se hodí použít generátory. Generátory umožňují líné vyhodnocování dat. Koncept líného vyhodnocování je užitečný při práci s velmi velkými datasety — umožňuje generovat hodnoty efektivně tím, že v každém okamžiku vrátí jen část dat, nikoli vše najednou.
V tomto cvičení definuješ generátorovou funkci read_large_file(), která vytvoří generátorový objekt vracející při každém volání next() jeden řádek ze souboru. CSV soubor 'world_dev_ind.csv' máš k dispozici v aktuálním adresáři.
Měj na paměti, že když otevřeš spojení se souborem, vzniklý souborový objekt je již sám o sobě generátor! V praxi tedy nemusíš generátorové objekty v takových případech vytvářet explicitně. Pro procvičení si to ale v tomto cvičení vyzkoušíš právě s funkcí read_large_file(). Jdeme na to!
Toto cvičení je součástí kurzu
Python Toolbox
Pokyny k cvičení
- Ve funkci
read_large_file()načti řádek zfile_objectpomocí metodyreadline(). Výsledek přiřaď do proměnnédata. - Ve funkci
read_large_file()vrať načtený řádekdatapomocí příkazuyield. - V kontextovém manažeru vytvoř generátorový objekt
gen_filevoláním své generátorové funkceread_large_file()a předánímfilejako argumentu. - Pomocí
next()vytiskni první tři řádky vrácené generátorovým objektemgen_file.
Interaktivní cvičení na vyzkoušení si v praxi
Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.
# 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(____)