【Python 事始め】進捗を表示しながらダウンロードする


ファイルをダウンロードしてローカルに保存するスクリプトを書いてみる。ただ保存するだけではつまらないので進捗状況を表示してみよう。

ファイルのダウンロードには urllib モジュールuriretrieve 関数を使う。

11.4 urllib — URL による任意のリソースへのアクセス
http://www.python.jp/doc/2.4/lib/module-urllib.html

urlretrieve 関数

次の 4 つの引数が指定できる。url 以外の指定は全て任意だ。

url
ダウンロード対象の URL
filename(任意)
保存するファイル名。指定しなかった場合はテンポラリフォルダに適当な名前で保存される。
reporthook(任意)
ブロックが読み出される度に呼び出される関数。
data(任意)
POST リクエストするときに使う。指定しなければ自動的に GET リクエストになる。

reporthook 引数に指定した関数には次の 3 つの引数が与えられる。

  • これまで転送されたブロック数のカウント
  • バイト単位で表されたブロックサイズ
  • ファイルの総サイズ

スクリプトの例 download_test.py

#!/usr/bin/python
# coding=utf-8
import urllib
import urlparse
import sys

# コマンドライン引数から URL を得る
url = sys.argv[ 1 ]
# URL からファイル名を得る
filename = urlparse.urlparse( url )[ 2 ].split( "/" )[ -1 ]

def progress( block_count, block_size, total_size ):
    ''' コールバック関数 '''
    percentage = 100.0 * block_count * block_size / total_size
    # 改行したくないので print 文は使わない
    sys.stdout.write( "%.2f %% ( %d KB )\r"
            % ( percentage, total_size / 1024 ) )

# ダウンロード開始
urllib.urlretrieve(
        url = url
        ,filename = filename
        ,reporthook = progress
        )
print

実行例

$ python download_test.py "http://www.exmple.com/archive.zip"
12.34 % ( 567 KB )

これだけ。簡単なもんだね。

コメントを残す