CommencerCommencer gratuitement

Écrire un générateur pour charger des données par blocs (2)

Dans l’exercice précédent, vous avez traité un fichier ligne par ligne pour un nombre de lignes donné. Mais que faire si vous souhaitez le faire pour l’intégralité du fichier ?

Dans ce cas, il est utile d’utiliser des générateurs. Les générateurs permettent d’évaluer paresseusement (https://www.blog.pythonlibrary.org/2014/01/27/python-201-an-intro-to-generators/) les données. Ce concept d’évaluation paresseuse est pratique lorsque vous travaillez avec des jeux de données très volumineux, car il vous permet de produire des valeurs de manière efficace en ne « yieldant » que des blocs de données à la fois, plutôt que tout d’un coup.

Dans cet exercice, vous allez définir une fonction génératrice read_large_file() qui produit un objet générateur renvoyant une ligne du fichier à chaque appel à next(). Le fichier CSV 'world_dev_ind.csv' se trouve dans votre répertoire de travail.

Notez que lorsque vous ouvrez une connexion à un fichier, l’objet fichier obtenu est déjà un générateur ! Donc, dans la pratique, vous n’aurez pas à créer explicitement des objets générateurs dans des cas comme celui-ci. Cependant, pour des raisons pédagogiques, nous vous faisons pratiquer cette approche ici avec la fonction read_large_file(). À vous de jouer !

Cet exercice fait partie du cours

Boîte à outils Python

Afficher le cours

Instructions

  • Dans la fonction read_large_file(), lisez une ligne depuis file_object avec la méthode readline(). Affectez le résultat à data.
  • Dans la fonction read_large_file(), utilisez yield pour renvoyer la ligne lue data.
  • Dans le gestionnaire de contexte, créez un objet générateur gen_file en appelant votre fonction génératrice read_large_file() et en lui passant file.
  • Affichez les trois premières lignes produites par l’objet générateur gen_file à l’aide de 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