Pythonのtqdmでプログレスバーを表示
不思議なことに、プログレスバーが表示されてると、人は待たされるイラつきを抑えることができるんだそう。
プログレスバーは、何かの処理の進捗具合を表すシンプルなグラフ。
何も表示せずにただ待たされると、「本当に処理してんのか」「フリーズしてんじゃないのか」と不安になって、SNSに「◯◯というアプリが固まった!バグだ!」とか書かれまくるところを、「今50%くらいですよ」と教えられることで、人は大人しく待ってられるんです。
目隠しされて車で運ばれると「何!?何!?どこ連れていかれんのよ?」という不安がわくけど、外の景色を見せてあげると「今は、新宿らへんか…」と現在地を確認できて安心する…というのと似ているのかも。
pythonのtqdmのインストール
tqdmのインストールはpipコマンドで実行します。(pip3は、python3用のpipコマンド)
# pip3 install tqdm
Collecting tqdm
Downloading https://files.pythonhosted.org/packages/8a/c4/d15f1e627fff25443ded77ea70a7b5532d6371498f9285d44d62587e209c/tqdm-4.64.0-py2.py3-none-any.whl (78kB)
100% |????????????????????????????????| 81kB 6.7MB/s
Collecting importlib-resources; python_version < "3.7" (from tqdm)
Downloading https://files.pythonhosted.org/packages/24/1b/33e489669a94da3ef4562938cd306e8fa915e13939d7b8277cb5569cb405/importlib_resources-5.4.0-py3-none-any.whl
Collecting zipp>=3.1.0; python_version < "3.10" (from importlib-resources; python_version < "3.7"->tqdm)
Downloading https://files.pythonhosted.org/packages/bd/df/d4a4974a3e3957fd1c1fa3082366d7fff6e428ddb55f074bf64876f8e8ad/zipp-3.6.0-py3-none-any.whl
Installing collected packages: zipp, importlib-resources, tqdm
Successfully installed importlib-resources-5.4.0 tqdm-4.64.0 zipp-3.6.0
import tqdmを実行してエラーが出なければ、インストール成功と考えていいでしょう。
$ python3 Python 3.6.9 (default, Jan 26 2021, 15:33:00) [GCC 8.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import tqdm >>>
pythonのtqdmの使い方
tqdmは、処理完了までの目安を表示する「プログレスバー」を表示するライブラリ。
時間がかかる処理の場合、無表示だと「あれ?フリーズした?」と思われてCtrl+Cを連打されてしまうことがありますが、プログレスバーを表示しておくとユーザが待ってくれる…という感じ。なお、Linuxにもtqdmコマンドというものがあり、シェルでも利用できる(Ubuntuの場合)
以下は、プログレスバーを表示するサンプルコードです。1つ目のプログレスバーは、forループでtqdm.tqdm()を呼び出して作成、2つ目はプログレスバーへのパラメータを指定してプログレスバーを進捗させています。
関連 Pythonのfor文
#!/usr/bin/python3 import tqdm import time # tqdmでプログレスバー for i in tqdm.tqdm(range(100)): time.sleep(0.01) # プログレスバーの進捗を手動で設定 with tqdm.tqdm(total=100) as probar1: # プログレスバー1 for i in range(0,100): probar1.set_postfix(progress=1) probar1.update(1) time.sleep(0.01)
with句でtqdm.tqdm()を呼び出し、プログレスバー名.update()などでパラメータを指定しているんですね。
今回、プログレスバー名をprobar1としています。
- プログレスバー名.set_postfix(progress=1) バーの後ろに情報(”progress=1″)を表示
- プログレスバー名.update(1) プログレスバーの進捗を1%進める
実行するとこうなります。
100%|??????????????????????????????????????| 100/100 [00:01<00:00, 98.30it/s] 100%|??????????????????????????| 100/100 [00:01<00:00, 95.29it/s, progress=1]
バーの長さが異なるのは、set_postfixで指定した文字列を入れて、同じ長さになるように自動調整されているせい…だと思います。
本来、プログレスバーの部分には正方形の塗りつぶしみたいな文字が表示されるのですが、日本語linux環境では文字化けして「?」の表示になってしまいます。
名前をつけることで、プログレスバーを入れ子にして、2重のプログレスバーを作ることもできます。全体の進捗を表すプログレスバーと、タスクごとの進捗を表すプログレスバーみたいなものが作れるんですね。
なお、パラメータはgithubのtqdmのページにドキュメントがあります。google日本語翻訳にかければ、まあまあ内容が把握できると思います。
tqdm/tqdm: Python および CLI 用の高速で拡張可能なプログレス バー
pythonのtqdmで文字化け対処する方法
Windows環境などでは、正常にプログレスバーが表示されるのですが、linux環境では文字化けします。
これはプログレスバーで使っている文字が、東アジアで幅が明確に定義されていない文字で作られているからです。このプログラムをマルチバイト圏でないロケールで動かすと正しく動きます。(もちろん他の使用に支障が出ます)
これを本気で直すにはプログレスバーのライブラリ本体を修正するしかありません。対象の文字を # で置き換えるなどの修正が必要です。
tqdmのパラメータを調べてみると、環境によってユニコード対応だと正方形の塗りつぶし文字を使う、という仕様になっている模様。「ユニコードなのに塗りつぶし文字が文字化けする」という環境は想定外ということでしょうか。
対処方法は、パラメータ指定で、ascii=Trueに設定します。強制的に「ユニコードに対応していない端末環境です」ということをわからせるんですね。
以下のサンプルでは、tqdm.tqdm()内にasciiパラメータを指定する場合と、プログレスバー名をつけてasciiパラメータを指定する例。バーが#で表示されて文字化けが解消します。
$ cat ./tqdm_sample_ascii.py #!/usr/bin/python3 import tqdm import time # tqdmでプログレスバー for i in tqdm.tqdm(range(100),ascii=True): time.sleep(0.01) # プログレスバーの進捗を手動で設定 with tqdm.tqdm(total=100) as probar1: # プログレスバー1 probar1.ascii=True for i in range(0,100): probar1.set_postfix(progress=1) probar1.update(1) time.sleep(0.01)
実行するとこうなります。進捗を示すバーが、「#」で表現されてめでたしめでたし。
$ ./tqdm_sample_ascii.py 100%|######################################| 100/100 [00:01<00:00, 98.33it/s] 100%|##########################| 100/100 [00:01<00:00, 95.52it/s, progress=1]
なお、ubuntuでpip3を使ってインストールされるtqdmのバージョンは4.64.0でした。
$ pip3 list | grep tqdm
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
tqdm (4.64.0)
各所で、バージョン5.0になったら何かが変わるみたいな話を見かけるので、バージョンがあがれば何かしら変わるのかも。
Jupyter Notebookでtqdmを使う
ターミナル環境だと、あまり活躍の場がなさそうなtqdmですが、Jypyter Notebook環境だと大活躍しそう。Notebook版はカラーにも対応しています。
進行中は緑、完了は青、エラーや中断は赤、ETAなしは水色とのことでした。ETAは到着時刻を表すので、水色は「完了しなさそう」みたいな意味かな…。
Pythonのtqdmのまとめ
- Pythonのtqdmはプログレスバー(進捗状況を示すバー)を表示するライブラリ
- バーが「?」で文字化けする場合は、パラメータascii=Trueに設定する
- Jupyter Notebook版ではカラー表示にも対応