Pythonでprint関数を使ってターミナルに出力する表示を常時更新しながら上書きしていく方法を解説します。出力する行数が多い場合、ターミナル表示が一気に流れてしまい確認しにくくなりますが、上書きしてプログレスバーのように1行表示させることでコンパクトにまとめることができ便利です。
キャリッジリターンとendオプション
print関数の出力を上書きして1行で表示するために必要となるのは『キャリッジリターン』と『endオプション』です。
キャリッジリターン(carriage return)
キャリッジリターンとはコマンド入力のカーソルを行頭に戻す役割を持っており、\\r
と書き、行頭復帰コードとも呼ばれます。
print関数のendオプション
print関数にはendオプションが用意されており、行末の動作や表示文字列を指定することができます。行末の表示文字列をデフォルトの改行文字\\n
から何もなし''
に指定することで自動的に改行されなくなります。
print('test1', end='')
print('test2', end='')
出力結果は test1test2
となります。
上書き出力の基本コード
ターミナル出力の上書き1行表示の基本的なコードは下記のようになります。ポイントはprint関数の引数先頭にキャリッジリターンをつけることとendオプションで''
を指定することです。
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%
となります。現在のインデックス番号に=
を掛け合わせることでプログレスバーの長さを作り、インデックスの残りに余白をかけてプログレスバー全体の記号を完成させています。
以上でPythonでprint関数の出力を上書きする方法について解説しました。このテクニックは、大量のデータを扱う際や長時間実行するプログラムの進行状況を視覚的に確認するのに非常に便利です。