schedule2024-02-27

Python:ファイルダウンロードの進行状況とファイルサイズを表示する方法。urllib

大きなファイルをダウンロードする際に進行状況を知りたくなります。 この記事では、urllibを使用してファイルをダウンロードする際に進行状況とファイルサイズを表示する方法を紹介します。

環境

  • Python 3.10

コード

import urllib.request

def progress_callback(block_num, block_size, total_size):
    """
    ダウンロード進行状況とファイルサイズのコールバック関数

    :param block_num: これまでにダウンロードされたデータブロックの数
    :param block_size: データブロックのサイズ(バイト)
    :param total_size: ダウンロード対象のファイルの合計サイズ(バイト)
    """
    downloaded_size = block_num * block_size  # これまでにダウンロードしたバイト数
    progress = 100.0 * downloaded_size / total_size  # ダウンロード進捗率
    progress = min(100, progress)  # 進捗率が100%を超えないようにする

    # ファイルサイズをMB単位で表示
    downloaded_size_mb = downloaded_size / 1024 / 1024  # MB単位に変換
    total_size_mb = total_size / 1024 / 1024  # MB単位に変換

    print(f"\rダウンロード進捗: {progress:.2f}% [{downloaded_size_mb:.2f}MB/{total_size_mb:.2f}MB]", end=''

url = "ファイルのURL"
local_file = "保存するローカルファイルのパス"

# reporthook にコールバック関数を設定してファイルをダウンロード
urllib.request.urlretrieve(url, local_file, reporthook=progress_callback)

urllib.request.urlretrieve()reporthookに状況を表示するコールバック関数を渡して表示できます。 この関数の引数に進捗や単位換算の処理を加えて表示しています。

  1. :param block_num: これまでにダウンロードされたデータブロックの数
  2. :param block_size: データブロックのサイズ(バイト)
  3. :param total_size: ダウンロード対象のファイルの合計サイズ(バイト)

さらに、\rを使用することで、進行状況が同じ行に上書きされ、コンソールが冗長な情報で溢れることがないようにしています。

表示例

ダウンロード進捗: 3.95% [40.73MB/1032.33MB]

urllib.request.urlretrieve()

ref : python docs urllib.request

(function) def urlretrieve(
    url: str,
    filename: StrOrBytesPath | None = None,
    reporthook: ((int, int, int) -> object) | None = None,
    data: _DataType = None
) -> tuple[str, HTTPMessage]
  • 引数
    • url: ダウンロードするリソースのURL。
    • filename: ダウンロードしたファイルを保存するローカルファイルのパス。この引数が None または指定されない場合、urlretrieve は一時的な場所にファイルを保存します。
    • reporthook: ダウンロードの進捗状況を報告するためのコールバック関数。この関数が指定されている場合、ダウンロードの進捗情報を取得するために使用されます。関数は3つの引数 (block_num, block_size, total_size) を取ります。
      • block_num: これまでにダウンロードされたデータブロックの数。
      • block_size: 各データブロックのサイズ(バイト単位)。
      • total_size: ダウンロード対象のファイルの合計サイズ(バイト単位)。合計サイズが不明の場合は -1。
    • data: POSTリクエストに送信するデータ。この引数が指定されている場合、リクエストはPOSTとして扱われます。通常、ファイルをダウンロードする際にはこの引数は使用されません。
  • 返り値
    • urlretrieve 関数はタプル (filename, headers) を返します。
      • filename: ダウンロードしたファイルが保存されたローカルファイルのパス。
      • headers: リクエストに対するサーバーの応答ヘッダーを表すオブジェクト。このオブジェクトは、HTTPヘッダー情報へのアクセスを提供します。