技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く色々なことに興味があります。

pythonで進捗バーを表示してみた

※python2.7系です

pythonで普通にprint文を書くと

for i in range(5):
    print i

0
1
2
3
4
となりコンソールに上書きされずに改行されてプリントされていく。

処理中のファイル名や内部変数の値などをリアルタイムで見ていきたい時は改行せず上書きしたほうが見やすいと思う。
そこでコンソールに上書きして表示する方法を調べてみた。
上書きして表示する方法はいくつかある。

  1. sys.stdout.write("~~\r")
  2. print ~~,"\r",

どちらかの後に

sys.stdout.flush()

を入れるだけ。
ポイントは "\r" を入れること。
キャリッジリターンといわれるものでカーソルを先頭行に移動させる意味があるらしい。


これを利用して進捗バーを表示するプログラムを作ってみた。

#coding:utf-8
import sys
from time import sleep

def progress_bar():
    for i in xrange(1,61):
        bar = "[" + "#"*int(i/2) + " "*(30 - int(i/2)) + "]"
        sys.stdout.write("%s(%d/60)\r"%(bar,(i)))
        sys.stdout.flush()
        sleep(1)
        
if __name__=="__main__":
    progress_bar()
  • 実行例
[################              ](32/60)


参考サイト:
コンソール画面に上書きして出力してゆく方法

追記

python3ではxrangeが廃止されているので
xrange -> range とする。


最近ではtqdmなるライブラリが出てきたのでそちらのほうが良い
【Python】進捗状況をprogress bar で表示(tqdm) - Qiita