Einen Generator schreiben, um Daten in Blöcken zu laden (2)
In der vorherigen Aufgabe hast du eine Datei Zeile für Zeile für eine bestimmte Anzahl von Zeilen bearbeitet. Was aber, wenn du dies für die gesamte Datei tun willst?
In diesem Fall wäre es sinnvoll, Generatoren zu verwenden. Mit Generatoren können Benutzer Daten per Lazy Evaluation auswerten. Dieses Konzept der Lazy Evaluation (bequeme oder faule Auswertung) ist nützlich, wenn du mit sehr großen Datensätzen hantieren musst, denn es ermöglicht dir, Werte auf effiziente Weise zu generieren, indem du jeweils nur Teile der Daten auswertest, anstatt alles auf einmal.
In dieser Aufgabe wirst du eine Generatorfunktion read_large_file()
definieren, die ein Generatorobjekt erzeugt, das bei jedem Aufruf von next()
eine einzelne Zeile aus einer Datei liefert. Die csv-Datei 'world_dev_ind.csv'
steht dir in deinem aktuellen Verzeichnis zur Verfügung.
Wenn du eine Verbindung zu einer Datei öffnest, ist das resultierende Dateiobjekt bereits ein Generator! In freier Wildbahn musst du in solchen Fällen also nicht explizit Generatorobjekte erstellen. Aus pädagogischen Gründen lassen wir dich hier jedoch mit der Funktion read_large_file()
üben, wie man das macht. Los geht‘s!
Diese Übung ist Teil des Kurses
Python Toolbox
Anleitung zur Übung
- Lies in der Funktion
read_large_file()
eine Zeile ausfile_object
, indem du die Methodereadline()
verwendest. Weise das Ergebnisdata
zu. - In der Funktion
read_large_file()
,yield
wird die Zeile aus der Dateidata
gelesen. - Erstelle im Kontextmanager ein Generatorobjekt
gen_file
, indem du deine Generatorfunktionread_large_file()
aufrufst und ihrfile
übergibst. - Gib die ersten drei Zeilen aus, die das Generatorobjekt
gen_file
mitnext()
erzeugt.
Interaktive Übung
Versuche dich an dieser Übung, indem du diesen Beispielcode vervollständigst.
# 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(____)