Pythonでダウンロード処理状況の進捗(プログレスバー)を表示する方法

Pythoを使って時間のかかる処理を実行する際に処理状況の進捗を手軽に表示させたいと思うときってあると思います。

私はネットから大きなファイルをダウンロード処理するときに進捗を見たくなります。

そんなときに便利なtqdmモジュールの使用方法を初心者向けに載せておきます。

tqdmのインストール

tqdmを使用すると処理の進捗をプログレスバーで表示することが手軽にできるようになります。

時間のかかる処理の進捗を確認したいときなどに便利です。

Pypi-tqdm

古くからあるモジュールで、Pypiに登録されています。

pip install tqdm でインストールできます。

tqdm-siyou-houhou

ちなみに、tqdmはアラビア語で「progress」を意味し、スペイン語では「I love you so much」の略語を意味するとのこと。

 

tqdmの基本的な使い方

詳しく使い方は、公式のページに書かれているので、この記事では、さくっと使える基本的な使い方を紹介したいと思います。

最初にtqdmをインポートするのは大前提です。

  • from tqdm import tqdm

 

tqdmの基本

tqdmの使い方の基本はイテラブルオブジェクトをtqdmで囲むことです。

  • text = “”
  • for char in tqdm([“a”, “b”, “c”, “d”]):
  •     text = text + char

 

tqdmを手動で設定する

for文でtqdm使用する

ループの外部でインスタンス化して、 tqdm()を手動で制御することもできます。

  • pbar = tqdm([“a”, “b”, “c”, “d”])
  • for char in pbar:
  •     pbar.set_description(“Processing %s” % char)
  • pbar.close()

この使い方をするとpbar.close()で閉じることを忘れないようにしましょう。

with文でtqdmを使用する

with文でtqdm()を使用することもできます。

また、tqdm()の到達値は total で、進捗バーの更新値はupdate()で設定することができます。

  • with tqdm(total=100) as pbar:
  •     for i in range(10):
  •         pbar.update(10)

 

tqdmでダウンロード処理の進捗状況(プログレスバー)を表示させる

tqdmの基本的な使い方で、実際に動画ファイルのダウンロード処理の進捗状況を表示させてみます。

大切なポイントは、自分がダウンロードするファイルのサイズを前もって取得してtotalに設定することと、進捗単位の値をupdateで設定することです。

python-download-sinchokujoukyou-hyouji-houhou-tqdm

  • with open(r“保存先のファイルパス”, ‘wb’) as file:
  •     pbar = tqdm(total=ダウンロードファイルのサイズ, unit=“B”, unit_scale=True)
  •     for chunk in requests.get(“ダウンロード対象のURL”, stream=True).iter_content(chunk_size=1024):
  •         ff= file.write(chunk)
  •         pbar.update(len(chunk))
  •     pbar.close()

これでいい感じにネットからのファイルダウンロード処理の進捗状況をいい感じのプログレスバーで表示してくれます。

オプションの簡単な捕捉説明をしておきます。

unit=”B” はプログレスバーの単位表示の指定をしています。(画像を見れば、”B”がどこに表示されているのかわかります)

unit_scale=True も単位表示の指定をしています。こちらは、 K,Mといった表示を使用するかどうかの指定になります。

tqdmとは関係ないですが、以下は私並みの初心者向けに捕捉です。
(requestsモジュールの使用を前提にしています)

requests.get(“ダウンロード対象のURL”, tream=True).iter_content(chunk_size=1024)という書き方は、ちょっとずつ処理をするための書き方です。

total=ダウンロードファイルのサイズ と記述してありますが、動画ファイルのURLの場合は、そこから302コードで転送した先のファイルからダウンロードすることもありますので、以下のようにしてファイルサイズを取得するようにするといいと思います。(video_urlがダウンロードファイルのURLです)

  • if requests.head(video_url).status_code == 302 :
  •     video_url = requests.head(video_url).headers[“Location”]
  • file_size = int(requests.head(video_url).headers[“content-length”])

 

以上の内容で、ネットから動画などの大きなファイルをダウンロードするときに進捗状況を把握しながら、処理をすることができると思います。

快適なPython生活を送る手助けになれたなら、幸いです。

タイトルとURLをコピーしました