少し前に、研究室のお菓子の会計ツールを開発していたときに学んだちょっとしたテクニックです。ターミナルで進捗バーのような表示、つまり「その場に文字を出力して、古い文字を消す」ことをしたい場合は、この記事を参考にしてください(ほかの言語でも同じ原理です)。

この効果はさまざまな場面で使えます。たとえばダウンロードの進捗を表示したいときや、出力画面が乱雑になるのを避けて、以前に出力した文字を消したいときなどに役立ちます。

通常、print で出力すると改行されます(または、前の出力の後ろに続けて表示されます)。

for i in range(10):
    print("*", end="")

しかし、シェルの特殊文字 \r を使うと、ターミナルのカーソルを現在の行の先頭に移動させ、その上から置き換える形で出力できます。

print("hello")
print("\rhi")

出力結果は hillo になります。hello を出力した後に改行していないため、カーソルが先頭の文字に戻り、hi の 2 文字を出力すると、先頭の he が置き換えられるからです。

この仕組みを使うと、進捗バーのような効果を作れます。

from time import sleep

for i in range(10): print("\r", end="") print("*" * i, end="") sleep(0.5)

実は \r だけでなく、画面全体をクリアしてから出力したい場合は clear コマンド(Windows なら cls コマンド)も使えます。私は会計プログラムを作っていたとき、画面が乱雑になって、前の操作ログを消して今の操作ログだけを表示したいと思いました。調べてみると、答えはすでに目の前にありました。

from os import system
from time import sleep

print(“hello”) print(“please login”)

sleep(1)

for i in range(10): system(“clear”) print("*" * i) sleep(0.5)