1. 学ぶ
  2. /
  3. コース
  4. /
  5. Python ツールボックス

Connected

演習

チャンクでデータを読み込むジェネレーターを書く(2)

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

この場合は、ジェネレーターを使うと便利です。ジェネレーターを使うとデータを遅延評価できます。 この「遅延評価」は、非常に大きなデータセットを扱うときに有効です。データを一度にすべてではなく、必要な分だけを順にyieldしていくことで、効率的に値を生成できるからです。

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

なお、ファイルに対して接続(open)すると、得られるファイルオブジェクト自体がすでにジェネレーターです。そのため、実務ではこのようなケースで明示的にジェネレーターオブジェクトを作る必要はありません。ただし学習目的のため、ここでは read_large_file() 関数を使ってその方法を練習します。やってみましょう!

指示

100 XP
  • 関数 read_large_file() の中で、file_object からメソッド readline() を使って1行読み込み、結果を data に代入します。
  • 関数 read_large_file() の中で、ファイルから読んだ行 data を yield します。
  • コンテキストマネージャ内で、ジェネレーター関数 read_large_file() を呼び出して引数に file を渡し、ジェネレーターオブジェクト gen_file を作成します。
  • next() を使って、ジェネレーターオブジェクト gen_file が返す最初の3行を表示します。