ジェネレーターを使ってデータをチャンク単位で読み込む(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()内で、読み込んだ行yieldをdataします。 - コンテキストマネージャー内で、ジェネレーター関数
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(____)