CommencerCommencer gratuitement

Ecrire un générateur pour charger des données par morceaux (2)

Dans l'exercice précédent, vous avez traité un fichier ligne par ligne pour un nombre de lignes donné. Mais que se passe-t-il si vous voulez le faire pour l'ensemble du fichier ?

Dans ce cas, il serait utile d'utiliser des générateurs. Les générateurs permettent aux utilisateurs d'évaluer paresseusement données. Ce concept d'évaluation paresseuse est utile lorsque vous devez traiter de très grands ensembles de données, car il vous permet de générer des valeurs de manière efficace en ne produisant que des morceaux de données à la fois au lieu de l'ensemble des données en une seule fois.

Dans cet exercice, vous définirez une fonction de générateur read_large_file() qui produit un objet générateur produisant une seule ligne d'un fichier chaque fois que next() est appelé sur celui-ci. Le fichier csv 'world_dev_ind.csv' se trouve dans votre répertoire actuel pour votre usage.

Notez que lorsque vous ouvrez une connexion à un fichier, l'objet fichier résultant est déjà un générateur ! Ainsi, dans la nature, vous n'aurez pas à créer explicitement des objets générateurs dans des cas comme celui-ci. Toutefois, pour des raisons pédagogiques, nous vous demandons de vous exercer à le faire ici avec la fonction read_large_file(). Allez-y !

Cet exercice fait partie du cours

Boîte à outils Python

Afficher le cours

Instructions

  • Dans la fonction read_large_file(), lisez une ligne de file_object en utilisant la méthode readline(). Affectez le résultat à data.
  • Dans la fonction read_large_file(), yield la ligne est lue à partir du fichier data.
  • Dans le gestionnaire de contexte, créez un objet générateur gen_file en appelant votre fonction générateur read_large_file() et en lui passant file.
  • Imprimez les trois premières lignes produites par l'objet générateur gen_file en utilisant next().

Exercice interactif pratique

Essayez cet exercice en complétant cet exemple de code.

# 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(____)
Modifier et exécuter le code