Python3 画面にループ処理の進捗とか示したい

こんにちは、kisseです。

以前、この記事でPythonで進捗を表示する記事っていうのを書いたんですが、どうやらPython3から新しい方法で進捗表示ができるようになったっぽいです。

この方法だと、かなり記述量が少なくなって簡単に理解できるので、だいぶ楽になりました。笑




やりたいこと

例えば、ループ処理の処理回数が多いだとか、1ループあたりの処理時間が長いとかで処理が帰って来なかったりすると、不安になりますよね??
そんなとき考えるのは、一体どれくらい処理が進んだかを表示する方法です。

from time import sleep

for i in range(1,10):
    print(i)
    # 重い処理のつもり
    sleep(1)

'''
1
2
3
4
5
6
7
8
9
'''

上のように、9行文結果が出力されてしまいました。
今回の場合は、これでも全く困りませんが、何千回もループするような処理だったりすると、大変ですよね。
なので、同じ列に何回も書いてもらうようにしましょう。

解決策

以下のようにコードを書きます。

from time import sleep

for i in range(1, 10):
    print('\r' + str(i), end = '') # <- ここだけ変更!
    # 重たい処理
    sleep(1)

'''
9 (1秒ずつ更新される)
'''

このようにすると、進捗を表示することができるようになります。

ここでprint()の中身を変更しました。
変更を見て行きましょう。
引数が2つあり、1つ目は出力する文字列を表現、2つ目は文字列の終端に付与する文字を指定しています。

‘\r’とはキャリッジリターンを示す文字コードです。これが入力されると文字カーソルが行の先頭に戻ります。
str(i)とは、int型である変数iをstr型にキャストしています。
Pythonでは2つの文字列を’+’で繋ぐと、文字列の連結を行うことができます。
ここで入力する文字列は“(カーソルを行頭に戻して)(変数iの値)”となります。

2つめの引数ですが、キーワード引数endに空の文字列”を指定します。
endになにも指定されなかった場合は改行コード’\n’が与えられています。
そのため、今回のように空の文字列を指定した場合には、入力の最後で改行が発生しないのです。

このようにして、進捗を表示できるようになりました!




おわり

このように進捗を表示させるようにすれば、待ち時間のストレスも解消されますね!
もし、1ループの処理に時間がかかるようであれば、1ループあたりの処理時間なども合わせて出力すると良いかもしれませんね。

最後まで読んでいただきありがとうございます!

あわせて読みたい