Tworzenie generatora do wczytywania danych we fragmentach (2)
W poprzednim ćwiczeniu przetwarzałeś(-aś) plik linia po linii przez określoną liczbę linii. Co jednak zrobić, gdy chcesz przetworzyć cały plik?
W takim przypadku przydają się generatory. Generatory umożliwiają leniwe przetwarzanie danych. Koncepcja leniwego przetwarzania jest szczególnie użyteczna przy bardzo dużych zbiorach danych – pozwala generować wartości efektywnie, zwracając (yielding) tylko fragmenty danych naraz, zamiast wczytywać wszystko od razu.
W tym ćwiczeniu zdefiniujesz funkcję generatora read_large_file(), która tworzy obiekt generatora zwracający pojedynczą linię z pliku przy każdym wywołaniu next(). Plik CSV 'world_dev_ind.csv' znajduje się w twoim bieżącym katalogu.
Zwróć uwagę, że po otwarciu połączenia z plikiem, wynikowy obiekt plikowy jest już generatorem! W praktyce nie trzeba więc jawnie tworzyć obiektów generatora w takich sytuacjach. Jednak w celach edukacyjnych ćwiczymy tutaj, jak to zrobić, korzystając z funkcji read_large_file(). Do dzieła!
To ćwiczenie jest częścią kursu
Zestaw narzędzi Pythona
Instrukcje do ćwiczenia
- W funkcji
read_large_file()wczytaj linię zfile_objectza pomocą metodyreadline(). Przypisz wynik dodata. - W funkcji
read_large_file()zwróć wczytaną liniędataza pomocąyield. - W menedżerze kontekstu utwórz obiekt generatora
gen_file, wywołując swoją funkcję generatoraread_large_file()i przekazując do niejfile. - Wydrukuj pierwsze trzy linie zwrócone przez obiekt generatora
gen_file, używającnext().
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
# 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(____)