Skriv en generator för att läsa in data i delar (2)
I föregående övning bearbetade du en fil rad för rad under ett givet antal rader. Men vad händer om du vill göra det för hela filen?
I ett sådant fall är generatorer mycket användbara. Generatorer låter dig lazy-evaluera data. Konceptet lazy evaluation är praktiskt när du arbetar med mycket stora datamängder, eftersom du kan generera värden på ett effektivt sätt genom att yielda bara delar av data i taget, i stället för allt på en gång.
I den här övningen definierar du en generatorfunktion read_large_file() som producerar ett generatorobjekt. Det objektet returnerar en enda rad från en fil varje gång next() anropas på det. CSV-filen 'world_dev_ind.csv' finns i din aktuella katalog.
Observera att när du öppnar en anslutning till en fil är det resulterande filobjektet redan en generator! I praktiken behöver du alltså inte skapa generatorobjekt explicit i sådana fall. Men av pedagogiska skäl får du öva på just det här med funktionen read_large_file(). Sätt igång!
Den här övningen är en del av kursen
Python Toolbox
Övningsinstruktioner
- I funktionen
read_large_file()läser du en rad frånfile_objectmed metodenreadline(). Tilldela resultatet tilldata. - I funktionen
read_large_file()använder duyieldför att returnera den inlästa radendata. - I kontexthanteraren skapar du ett generatorobjekt
gen_filegenom att anropa din generatorfunktionread_large_file()och skickafiletill den. - Skriv ut de tre första raderna som generatorobjektet
gen_fileproducerar med hjälp avnext().
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
# 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(____)