プログレスバーを作るのはちょっと面倒ですが、1000回ループする処理があった場合に「1/1000」「2/1000」のような表示を、改行せずに同じ行にprintするすごく簡単な方法を解説します。
使うのはキャリッジリターンとprintだけ
キャリッジリターンとは、カーソルを行末から行頭に戻す操作をする制御文字で、\r で表されます。これと改行なしprintを組み合わせて print(“\r文字列”, end=””) とすることで、改行をせずに同じ行に進捗状況を表示できます。
N = 1000
x = 0
for i in range(N):
x += 1
print("\r %5i / %5i"%(i+1, N), end="")
print("")
print("x=", x)
この例では1000回のループ内でxに1を足すという処理しか入っていないのですぐに終わりますが、これが1秒かかる処理だった場合は1000秒かかってしまいます。1000秒間結果が出るのを待ち続けるのも嫌だし、かといってループ1回ごとに1回のprintをしてしまうと1000行の出力が出てきてしまいます。この方法を使うことで、その進捗を「1/1000」「2/1000」…「1000/1000」と、同じ行に表示させることができます。
ループを抜けた後に無をprintしていますが、これはループの最後にprintされた文字が改行を含まないためです。これをしないと「1000/1000x=1000」のような表示になります。無をprintすることで「1000/1000」と「x=1000」の間に改行が入り、きれいに表示できます。
また、この方式で進捗を表示する場合は表示する文字列の長さを統一したほうが見栄えがいいです。上記の例では %5i で5桁の整数を表示するようにすることで、数字の桁が少なくてもスペースで埋めて5個分の長さで表示できます。このやり方の詳細は以下の記事で紹介しています。
以上!
コメント