Pythonでプログレスバーを表示する方法|処理の進捗を可視化しよう

python icon
Python

こんにちは、とまだです。

長い処理を待っているとき、「今どこまで進んでるんだろう」と不安になりませんか?

今回は、Pythonでプログレスバーを表示する方法について解説します。

プログレスバーとは?

プログレスバーは、処理の進行状況を視覚的に表すバーのことです。

ちょうどファイルをダウンロードするときに表示される、あの青いバーと同じです。

0%から100%まで徐々に埋まっていく様子を見ることで、処理の進み具合が一目でわかります。

なぜプログレスバーが必要なのでしょうか。

それは、処理時間の見通しが立つからです。

例えば、料理で「あと5分で完成」とわかれば安心しますよね。

プログラムでも同じように、進捗がわかることで待ち時間のストレスが軽減されます。

プログレスバーが活躍する場面

実際の開発では、次のような場面でプログレスバーが役立ちます。

まず、どんなときに使うのか整理してみましょう。

  • 大量のデータを処理するとき
  • ファイルのアップロード・ダウンロード
  • 画像や動画の変換処理
  • APIから大量のデータを取得するとき

これらの処理は数秒から数分かかることが多いです。

そんなとき、何も表示されないと不安になりますよね。

tqdmを使った簡単な実装

Pythonでプログレスバーを表示する最も簡単な方法は、tqdmライブラリを使うことです。

インストール方法

まずはtqdmをインストールしましょう。

pip install tqdm

たった1行のコマンドで準備完了です。

基本的な使い方

では、実際にプログレスバーを表示してみましょう。

from tqdm import tqdm
import time

# 100回のループでプログレスバーを表示
for i in tqdm(range(100)):
    time.sleep(0.01)  # 処理のシミュレーション

このコードでは、ループの進行に合わせてバーが伸びていきます。

画面には進捗率、経過時間、推定残り時間が表示されます。

とても便利ですよね。

手動でプログレスバーを作る方法

ライブラリを使わずに、自分でプログレスバーを作ることもできます。

シンプルな仕組みを理解するには、こちらの方法も知っておくと良いでしょう。

import sys
import time

total = 50

for i in range(total + 1):
    # 進捗率を計算
    progress = (i / total) * 100

    # バーを作成
    bar_length = 20
    filled = int(bar_length * i // total)
    bar = "#" * filled + "-" * (bar_length - filled)

    # 画面に表示
    sys.stdout.write(f"\r進捗: [{bar}] {progress:.1f}%")
    sys.stdout.flush()

    time.sleep(0.05)

このコードのポイントは、\rで行頭に戻ることです。

そうすることで、同じ行を更新し続けることができます。

まるでデジタル時計の数字が切り替わるような仕組みです。

プログレスバーのメリット

プログレスバーを導入すると、次のようなメリットがあります。

ユーザー体験の向上

待ち時間の目安がわかると、ユーザーは安心します。

例えば、電子レンジのタイマーと同じです。

「あと1分」とわかれば、その間に別のことができますよね。

デバッグの効率化

処理がどこで遅くなっているかも把握しやすくなります。

もし特定の箇所でバーの進みが遅くなれば、そこがボトルネックです。

処理の中断判断

予想以上に時間がかかりそうなら、早めに中断できます。

これは非常に実用的なメリットです。

他のプログレスバーライブラリ

tqdm以外にも、いくつかのライブラリがあります。

それぞれ特徴があるので、用途に応じて選ぶと良いでしょう。

progressライブラリ

シンプルで軽量なライブラリです。

基本的な機能だけで十分な場合に適しています。

alive-progress

カラフルでアニメーション豊かなプログレスバーを表示できます。

見た目を重視したい場合におすすめです。

どのライブラリも基本的な使い方は似ています。

プロジェクトの要件に合わせて選択しましょう。

実装時の注意点

プログレスバーを実装する際は、いくつか注意すべき点があります。

正確な時間予測の難しさ

処理内容によっては、正確な完了時間を予測できません。

特に外部APIを使う場合は、通信速度に左右されます。

パフォーマンスへの影響

頻繁に画面を更新すると、処理が遅くなることがあります。

適度な間隔で更新するよう工夫が必要です。

複雑なループ構造での対応

ネストしたループでは、どのループに対してプログレスバーを表示するか検討が必要です。

最も外側のループに設置するのが一般的です。

カスタマイズのコツ

プログレスバーは、用途に応じてカスタマイズできます。

説明文の追加

tqdmでは、処理内容を説明する文字を追加できます。

for i in tqdm(range(100), desc="データ処理中"):
    time.sleep(0.01)

このように書くと、バーの横に「データ処理中」と表示されます。

わかりやすさが格段に向上します。

単位の表示

処理するアイテムの単位も表示できます。

for i in tqdm(range(100), unit="ファイル"):
    time.sleep(0.01)

「100ファイル中50ファイル処理済み」のような表示になります。

まとめ

プログレスバーは、長時間かかる処理を快適にする重要な要素です。

tqdmを使えば、たった数行のコードで実装できます。

また、手動実装を通じて仕組みを理解することも大切です。

処理の進捗を可視化することで、開発効率も向上します。

ぜひ実際のプロジェクトで活用してみてください。

共有:

著者について

とまだ

とまだ

フルスタックエンジニア

Learning Next の創設者。Ruby on Rails と React を中心に、プログラミング教育に情熱を注いでいます。初心者が楽しく学べる環境作りを目指しています。

著者の詳細を見る →