【関連記事】【Pythonのライブラリ管理ツール】pipインストールを徹底解説!Windowsでも簡単?
Pythonでプログレスバーを作成する

Pythonでは、処理中に進捗を表示させたい場合が多くあります。データサイエンスで活用することが多いために、データの分析や機械学習など多くの場面が思い浮かびます。
ここでは、Pythonで比較的良く用いられる可視化ライブラリ、および自作のコードを用いた進捗表示のプログレスバーについて解説していきます。

プログレスバーの構成要素
プログレスバーはそこまで複雑ではありませんが、以下の構成要素を覚えておくと良いでしょう。
・プログレスバーの使用準備と初期設定 ライブラリを用いる場合は、その読み込み(import)と使用の宣言などを行います。プログレスバーは決まった回数回す場合はループ回数を設定しておきます。
・プログレスバーの実行 ここでは、実際に行う処理を記述します。その後プログレスバーの表示を更新する処理を行い、進捗表示に反映させます。
・プログレスバーの終了 ここでは、ライブラリ固有の終了処理を宣言します。必要に応じて進捗表示の時間を遅らせる場合は、終了処理の前に疑似的にSleepを入れて表示を維持することができます。
Pythonのプログレスバーを使ってみる

Pythonでプログレスバーを使うには、tqdmやprogressbar2・PyPrindなどを使います。また自前でコードを作成したり、GUIではtkinterを用いたりすることもできます。ここでは、これら5つの方法を使って、プログレスバーを実際に作成・実行し、解説していきます。

プログレスバーの出力の確認
プログレスバーを使うには、出力された表示にエスケープシーケンスを使用するのが一般的です。エスケープシーケンスは、ターミナル出力をエミュレーションする機能を用いて表示されます。そのため、使用する開発環境によっては、正しく表示されないことがあります。
次の図をご覧ください。これはPythonの標準IDE(統合開発環境)のIDLEを使用した例です。エディターウィンドウの「Run」「Run Module」のメニューからコードを実行できます(①)。
実行結果は、右のように表示されますが、先頭から表示するエスケープシーケンスが正しく表示されず、出力が時系列に表示されていることが分かります(②)。

次の図は、Google Colabでの実行結果です。Colabでは、実行ボタンをクリックすると、実行結果が表示領域に1行のみ表示されプログレスバーが順次更新されています(①②)。

このように、プログレスバーが正しく表示できない場合は、別の実行環境で実行し出力結果を確認するのが良いでしょう。以降では、この表示の影響を考慮してPythonから直接実行した結果を用いて図解していきます。

tqdm
tqdmは、良く用いられるプログレスバーのライブラリです。使用するには、ライブラリをインストールする必要があり、“pip install tqdm”であらかじめインストールしておきます。以下は、コード部分の構成要素です。
・プログレスバーの使用準備と初期設定 ライブラリの読み込み(”import tqdm”)とtqdm()ライブラリをコールし、事前準備しておきます。ここではループ回数は10回にします。
・プログレスバーの実行 ここでは、実際に行う処理の代わりに疑似的に1.0秒Sleepを行います。その後プログレスバーの表示を更新する処理として、tqdm.update()をコールします。
・プログレスバーの終了 表示を1.0秒維持したのち、終了処理として、tqdm.close()をコールします。
実際のコードと実行結果は次の図をご覧ください(①②③④)。


この例では、進捗率と目盛りで進捗を表示しています。表示方法は、ライブラリコールで調整が可能です。
【参考】:tqdm
progressbar2
progressbar2も、良く用いられるプログレスバーのライブラリです。使用するには、ライブラリは、“pip install progressbar2”であらかじめインストールしておきます。以下は、コード部分の構成要素です。
・プログレスバーの使用準備と初期設定 最初にライブラリの読み込み(”import progressbar”)を行い、progressbar()ライブラリをコールします。開始するには、progressbar.start()をコールします。ここでもループ回数を10回にします。
・プログレスバーの実行 ここでは、実際に行う処理の代わりに疑似的に1.0秒Sleepを行います。その後プログレスバーの表示を更新する処理として、progressbar.update()をコールします。
・プログレスバーの終了 表示を1.0秒維持したのち、終了処理として、progressbar.finish()をコールします。
実際のコードと実行結果は次の図をご覧ください(①②③④)。


この例でも、進捗率と目盛りで進捗を表示しています。表示方法は、ライブラリコールで調整が可能です。
【参考】:PyPi progressbar2 【参考】:progressbar2
PyPrind
PyPrindも、良く用いられるプログレスバーのライブラリです。ライブラリは、“pip install pyprind”であらかじめインストールしておきます。以下は、コード部分の構成要素です。
・プログレスバーの使用準備と初期設定 最初にライブラリの読み込み(”import pyprind”)を行い、pyprind.ProgBar()ライブラリをコールします。ここでもループ回数を10回にします。
・プログレスバーの実行 ここでは、実際に行う処理の代わりに疑似的に1.0秒Sleepを行います。その後プログレスバーの表示を更新する処理として、pyprind.update()をコールします。
・プログレスバーの終了 表示を1.0秒維持したのち、終了処理として、pyprind.atop()をコールします。
実際のコードと実行結果は次の図をご覧ください(①②③④)。


この場合も表示方法は、ライブラリコールで調整が可能です。
【参考】:PyPi PyPrind 【参考】:PyPrind
自分でコードを作成する
先に挙げた3種類のライブラリで、多くの表示に対応できますが、要件に応じてよりカスタマイズしたい場合は自分でコードを作成することもできます。自分でコードを記述するのでライブラリは不要となります。以下は、コード部分の構成要素です。
・プログレスバーの使用準備と初期設定 自分でコードを作成するため、ライブラリの読み込みは不要です。ループ回数を10回にします。
・プログレスバーの実行 ここでは、実際に行う処理の代わりに疑似的に1.0秒Sleepを行います。表示する文字列を作成する必要がありますが、要件に応じて決定することができます。
文字列はprint()で表示させますが、デフォルトでは現在の位置から表示して、改行されるようになっています。ここで重要なことは”\r”を出力して、行頭から表示させることです。end=””で、改行されずに表示させることができます。改行されても構わない場合は、”\r”やend=””を追加する必要はありません。
・プログレスバーの終了 終了処理も、ライブラリを使用しないので特別なコールは不要です。
実際のコードと実行結果は次の図をご覧ください(①②③④)。


自分でコードを作る場合は、表示形式は自分で決められるメリットがあります。ここでは、”#”の個数で進捗を表しましたが、例えば”\”・”|”・”/”・”-”を順に表示し、処理中にぐるぐる回るような表示をさせることも可能です。
tkinter
tkinterは、Pythonの標準機能でGUIの構築や操作が可能なライブラリです。標準機能ですので、ライブラリの追加インストールは不要です。GUIのウィジェットとしてプログレスバーを表示させることができます。以下は、コード部分の構成要素です。
・プログレスバーの使用準備と初期設定 ライブラリの読み込み(”import tkinter”、”inport ttk”)を行い、ウィンドウ作成を行っておきます。ttk.Progressbar()でプログレスバーをウィンドウに作成します。ここではループ回数は10回にします。
・プログレスバーの実行 ここでは、実際に行う処理の代わりに疑似的に1.0秒Sleepを行います。その後プログレスバーの表示を更新する処理として、ttk.Progressbar()[]の値を更新後windows.update()をコールします。
・プログレスバーの終了 ここではmainloop()で表示は維持されていますので、終了時にはウィジェットを閉じます。
実際のコードと実行結果は次の図をご覧ください(①②③④)。


こちらは、ウィジェットを用いて進捗度を表示しています。ウィジェットに何を表示させるかは、自由に決めることができます。個別に別ウィンドウを表示させて、進捗を表示することも可能です。
【参考】:Python Docs: tkinter --- Tcl/Tk の Python インターフェース

Pythonのプログレスバーは大量データの処理に効果的

Pythonは、データサイエンス向けのライブラリが数多く公開されており、データ分析や機械学習などに利用されています。実行時間はデータ量に比例して処理量が増加しますので、完了予定時間や進捗度を表示することで、正しく動作していることも確認でき、有効です。
プログレスバーのライブラリや自作コードは、1度作成しておくと再利用できますので、大量データの分析などを予定する場合は、あらかじめ準備することをおすすめします。


編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから