Pythonで進捗バーを表示する。
Pythonで処理する際に、どれだけ処理が完了したのかコンソール画面に表示します。
進捗バー(プログレスバー)を作成したい方に向けて、tqdmを使用した進捗表示の方法を解説します。
本記事では、tqdmの基本の使い方や実際のソースコードを例示し、
処理の進捗をわかりやすく表示する方法を紹介します。
- Pythonで進捗バーを使いたい人
- 処理の進捗を視覚的に表示したい開発者
- 大量データを処理する際の進捗表示をスマートに実装したい方
- tqdmの基本的な使い方を覚えたい人
- Pythonで自動化処理を行う際に進捗ゲージを追加したい方
- 処理時間が長い作業の進捗をわかりやすく表示したい方
tqdmとは
モジュールtqdmは、処理の進捗を視覚的に表示するための便利なライブラリです。
大量のデータや複数の処理を行う際、その進捗を表示することで、
開発者やユーザーに安心感を提供します。
進捗表示を使うことで、大規模なプロジェクトや複雑なタスクでも、
現在どの程度進行しているのかを一目で把握できるようになります。
例えば、データ処理の際にも、どれくらいの作業が完了したか、
予定に対してどれだけ進んでいるのかを視覚化することが可能です。
tqdmをインストールするには、pipを使用します。
pip install tqdm
基本的な機能
基本的な使い方としては、forループにtqdmを追加するだけで、
簡単に進捗バーを表示することができます。
tqdmは、処理の進行状況を正確に視覚化するだけでなく、
プログラムのパフォーマンスにほとんど負担をかけずに自然に表示できるので、非常に便利です。
また、進捗をリアルタイムで確認できるため、
長時間の処理でもユーザーに安心感を与えることができます。
from tqdm import tqdm
import time
for i in tqdm(range(10), desc="Processing"):
time.sleep(0.5) # 一時停止を作る
このコードでは、10回のループを繰り返している間に進捗バーが表示されます。
descを使って処理内容を説明することで、
何をしているのかをユーザーにわかりやすく伝えることができます。
これにより、ユーザーにも進行状況が伝わり、処理が進んでいる感覚を共有できます。
すべての処理の完了率をゲージで表示
指定されたフォルダ内の画像ファイルをWebP形式に変換する処理を実行します。
処理は、フォルダ内のファイルを順次ループし、
PillowライブラリのImage関数を使って画像をWebP形式に変換します。
その際、tqdmを用いて進捗状況を一歩ずつ表示し、処理の完了までの時間を視覚化しています。
これにより、処理がどの程度進んでいるかを簡単に把握することができ、
使用者や開発者が実行時間を予測したり、処理の進行を確認することが可能です。
また、処理中にエラーが発生した場合、どのファイルで問題が発生したのかを明確に特定できるため、トラブルシューティングも容易です。
ソースコード・解説
- モジュール名
「PIL (Pillow)」:Python Imaging Library(PIL)を拡張したPillowモジュールは、画像ファイルの読み込みや保存、編集を行うために必要です。インストールは「pip install Pillow」を使用します。
「os」:ファイルやディレクトリのパス操作を行うために必要です。特にフォルダの存在確認やファイルのパス取得に使用します。
「tqdm」:長時間実行する処理の進捗状況を視覚的に表示するために必要です。インストールは「pip install tqdm」を使用します。
「time」:処理に微小な遅延を持たせるために必要です。これにより進捗バーが滑らかに動くように見せる効果があります。
from PIL import Image
import os
from tqdm import tqdm
import time
- フィールド(メンバ変数)
「input_folder」:変換対象となる画像ファイルが格納されているフォルダのパスです。
「output_folder」:変換後の画像ファイルを保存するためのフォルダのパスです。
「file_list」:入力フォルダ内の変換対象画像ファイルのリストです。
「progress_bar」:tqdmによって生成される進捗バーオブジェクトで、処理の進捗を視覚的に表示するためのものです。
「input_path」:入力画像ファイルの絶対パスです。
「output_path」:変換後のWebP形式の画像ファイルの絶対パスです。
- convert_to_webp関数
この関数は、指定されたフォルダ内の画像ファイルをWebP形式に変換する処理を行います。
最初に出力フォルダが存在しない場合は新たに作成し、
入力フォルダ内の画像ファイルを拡張子でフィルタリングして取得します。
取得したファイルリストを使って、一つずつ画像ファイルを開き、
WebP形式に変換して出力フォルダに保存します。
処理の進捗状況はtqdmで表示し、
全てのファイルが処理されるとメッセージを表示します。
def convert_to_webp(input_folder, output_folder):
# 出力フォルダが存在しない場合は作成する
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# フォルダ内のファイルを取得する
file_list = [f for f in os.listdir(input_folder) if f.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp'))]
# ファイル数が0の場合、処理を終了
if not file_list:
print("画像ファイルが見つかりませんでした。")
return
# tqdmで進捗バーを作成
progress_bar = tqdm(total=len(file_list), desc="変換中", unit="file", smoothing=0.1)
for file_name in file_list:
# ファイルの絶対パスを取得する
input_path = os.path.join(input_folder, file_name)
output_path = os.path.join(output_folder, os.path.splitext(file_name)[0] + '.webp')
# 画像を開いてWebP形式で保存する
try:
with Image.open(input_path) as image:
image.save(output_path, 'webp')
except Exception as e:
print(f"エラー: {file_name} ({e})")
# 進捗バーを更新
progress_bar.update(1)
time.sleep(0.01) # 流れる感覚を持たせるための微小な遅延
progress_bar.close()
print("全ての画像の変換が完了しました!")
# フォルダのパスを指定して変換を実行する
input_folder = 'Input'
output_folder = 'Output'
convert_to_webp(input_folder, output_folder)
UdemyでPythonを学習
Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。
- 現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
Pythonをインストールから環境設定、基本文法が学習
さらに暗号化、インフラ自動化、非同期処理についても学べます。
Pythonを基礎から応用まで学びたい人におすすめ
- みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習 【2024年最新版】
機械学習ライブラリで文字認識や株価分析などを行う。
人口知能やニューラルネットワーク、機械学習を学びたい人におすすめ。
- 【世界で55万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜
統計分析、機械学習の実装、ディープラーニングの実装を学習。
データサイエンティストになりたい人におすすめ。
- 0から始めるTkinterの使い方完全マスター講座〜Python×GUIの基礎・応用〜
TkinterのGUIを作成から発展的な操作までアプリ実例を示して学習。
アプリ開発したい人におすすめ。
実演
プログラムを実行すると、冒頭で示したような進捗バーが表示されます。
本記事での例では、画像変換なのであまり進捗バーの役割を成さないですが、
動画や人工知能などの大きいデータを扱う場合は進捗バーがあるとプログラムが動いているのか把握できます。
必要に応じて、プログレスバーを導入してください。
まとめ
本記事では、Pythonで進捗バーを作成するためのライブラリ、tqdmの使い方を解説しました。
既存のスクリプトにtqdmを実装することで、処理の進捗を視覚的に確認しながら、
効率的に作業を進めることが可能になります。
tqdmを使うことで、従来の処理に比べてよりユーザーフレンドリーな体験を提供し、
開発者は実行中の処理を可視化しやすくなり、デバッグや評価時の助けにもなります。
次回の開発では、さらに複雑な処理にもこの進捗表示を実装して、便利さを向上させていきましょう。