Kom igångKom igång gratis

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

Visa kurs

Övningsinstruktioner

  • I funktionen read_large_file() läser du en rad från file_object med metoden readline(). Tilldela resultatet till data.
  • I funktionen read_large_file() använder du yield för att returnera den inlästa raden data.
  • I kontexthanteraren skapar du ett generatorobjekt gen_file genom att anropa din generatorfunktion read_large_file() och skicka file till den.
  • Skriv ut de tre första raderna som generatorobjektet gen_file producerar med hjälp av next().

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(____)
Redigera och kör kod