Pythonでprint関数のターミナル出力を上書きで1行表示する方法のイメージ画像

Pythonでprint関数のターミナル出力を上書きで1行表示する方法

  • 公開日:2018/11/05
  • 更新日:2018/11/05
  • 投稿者:n bit

Pythonでprint関数を使ってターミナルに出力する表示を常時更新しながら上書きしていく方法を解説。出力する行数が多い場合ターミナル表示が一気に流れてしまい確認しにくくなりますが上書きしてプログレスバーのように1行表示させることでコンパクトにまとめることができ便利です。

  • Python

この記事は約 分で読めます。(文字)

print関数のターミナル出力を上書き表示

行数が非常に多いcsvファイルなどを扱う場合、実行処理の途中経過をenumerate関数等を使いインデックス番号をprint関数で出力するとターミナルが一気に流れてしまうため、その他の処理結果の出力内容が確認しにくくなります。

for i in range(1000):

print(i)

出力結果

0

1



998
999

この様な感じで1000行ターミナルの出力行が流れていくと見にくいですよね。

そこで今回はループ処理内で連続出力するインデックス等の出力を上書きしながら1行で表示する方法やプログレスバーのような表示に変更する方法を解説します。

キャリッジリターンとendオプション

print関数の出力を上書きして1行で表示するために必要となるのは『キャリッジリターン』と『endオプション』です。

キャリッジリターン(carriage return)

キャリッジリターンとはコマンド入力のカーソルを行頭に戻す役割を持っており『\r』と書き、行頭復帰コードとも呼ばれます。

print関数のendオプション

print関数にはendオプションが用意されており行末の動作や表示文字列を指定することができます。行末の表示文字列をデフォルトの改行文字『\n』から何もなし『''』に指定することで自動的に改行されなくなります。

print('test1', end='')

print('test2', end='')

出力結果

test1test2

endオプションに『''』を指定したことで上記のようにテスト1とテスト2の間に改行がなくなりました。

print関数のターミナル出力を上書きで1行表示するコード

実際に『キャリッジリターン』と『endオプション』を利用してprint関数のターミナル出力を上書きして1行で表示させてみましょう。

上書き出力の基本コード

ターミナル出力の上書き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%
現在のインデックス番号に『=』を掛け合わせることでプログレスバーの長さを作り、インデックスの残りに余白をかけてプログレスバー全体の記号を完成させています。
    pro_bar = ('=' * i) + (' ' * (pro_size - i))

後は『キャリッジリターン』と『endオプション』を使って先ほど作成したプログレスバーの記号を上書き更新表示させていて、やり方は基本コードと同じです。

プログレスバー表示:現在値/最大値タイプ

次は現在値/最大値で進捗具合を確認できるようにしたタイプのものです。基本的なコードの流れは%タイプと同じになります。

import time


pro_size = 10
for i in range(1, pro_size + 1):
pro_bar = ('=' * i) + (' ' * (pro_size - i))
print('\r[{0}] {1}/{2}'.format(pro_bar, i, pro_size), end='')
time.sleep(0.5)

出力結果

[==========] 10/10
このように工夫次第で様々なプログレスバーのデザインを作成することができます。

今日のdot

自然言語処理などを行うと読み込むファイルが2,000万行あったりすることもあります。そのため実行処理が完了するまでの時間も長く進捗状況を表示させておかないと処理が行われているのか、途中で止まっているのかの確認がしにくいですよね。

かといって進捗具合をそのままprint関数で出力してしまうととんでもない行がターミナルに流れることになりますので今回のような上書き1行表示の出力を書いて進捗状況を確認するのが良いでしょう。