始める無料で始める

ジェネレーターを使ってデータをチャンク単位で読み込む(2)

前回の演習では、ファイル全体を指定した行数だけ1行ずつ処理しました。しかし、ファイル全体に同じ処理をしたい場合はどうでしょうか?

この場合に有効なのがジェネレーターです。ジェネレーターはユーザーがデータを遅延評価することを可能にします。 この遅延評価という考え方は、非常に大きなデータセットを扱う際に便利です。なぜなら、一度にデータの一部だけを効率的に生成し、全体を一度に処理するのではなく、値を効率的に生成できるからです。

この演習では、ジェネレーター関数read_large_file()定義します。この関数はnext()が呼び出されるたびにファイルから1行の生成オブジェクトを生成するものです。csvファイル'world_dev_ind.csv'は現在のディレクトリに入っています。

ファイルへの接続を開くと、その結果生まれたファイルオブジェクトはすでにジェネレーターになっています!そのため、実際にそういった場合にジェネレーターオブジェクトを明示的に作成する必要はありません。しかし、ここではread_large_file()関数でどのように行うかを勉強のために練習してもらいます。さあ、挑戦してみてください!

この演習はコースの一部です

Python Toolbox

コースを見る

演習の手順

  • 関数 read_large_file() 内で、file_object メソッドを使って readline() から1行を読み込みます。結果を data に代入してください。
  • 関数 read_large_file() 内で、読み込んだ行 yielddata します。
  • コンテキストマネージャー内で、ジェネレーター関数 gen_file を呼び出して read_large_file() を渡し、ジェネレーターオブジェクト file を作成します。
  • gen_file を使って、ジェネレーターオブジェクト next() が生成する最初の3行を出力してください。

実践的なインタラクティブ演習

このサンプルコードを完成させて、この演習に挑戦してみましょう。

# 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(____)
コードを編集して実行