Pythonでprint関数を使ってターミナルに出力する表示を常時更新しながら上書きしていく方法を解説します。出力する行数が多い場合、ターミナル表示が一気に流れてしまい確認しにくくなりますが、上書きしてプログレスバーのように1行表示させることでコンパクトにまとめることができ便利です。
キャリッジリターンとendオプション
print関数の出力を上書きして1行で表示するために必要となるのは『キャリッジリターン』と『endオプション』です。
キャリッジリターン(carriage return)
キャリッジリターンとはコマンド入力のカーソルを行頭に戻す役割を持っており、\\r
と書き、行頭復帰コードとも呼ばれます。
print関数のendオプション
print関数にはendオプションが用意されており、行末の動作や表示文字列を指定することができます。行末の表示文字列をデフォルトの改行文字\\n
から何もなし''
に指定することで自動的に改行されなくなります。
print('test1', end='')
print('test2', end='')
出力結果はtest1test2
となり、test1
とtest2
の間に改行がなくなります。
上書き出力の基本コード
実際に『キャリッジリターン』と『endオプション』を利用してprint関数のターミナル出力を上書きして1行で表示させてみましょう。
import time
for i in range(10):
print('\\rNo, %d' % i, end='')
time.sleep(0.5)
出力結果はNo, 9
となります。コードの実行結果を確認しやすいようにtime.sleep(0.5)
で0.5秒間隔をあけるようにしています。
プログレスバー表示
基本コードを少し発展させてプログレスバー表示を作ってみましょう。
import time
pro_size = 10
for i in range(1, pro_size + 1):
pro_bar = ('=' * i) + (' ' * (pro_size - i))
print('\\r[{0}] {1}%'.format(pro_bar, i / pro_size * 100.), end='')
time.sleep(0.5)
出力結果は[==========] 100.0%
となります。
このように工夫次第で様々なプログレスバーのデザインを作成することができます。自然言語処理などを行うと読み込むファイルが2,000万行あったりすることもあります。そのため実行処理が完了するまでの時間も長く進捗状況を表示させておかないと処理が行われているのか、途中で止まっているのかの確認がしにくいですよね。かといって進捗具合をそのままprint関数で出力してしまうととんでもない行がターミナルに流れることになりますので、今回のような上書き1行表示の出力を書いて進捗状況を確認するのが良いでしょう。