LoginSignup
12
13

More than 3 years have passed since last update.

Pythonでファイルをダウンロード&プログレスバーを表示させる

Last updated at Posted at 2019-02-16

概要

表題の通りです。Python3で動きます。
指定したURLのファイルを取得して、コンソールにプログレスバーをprintします。
書いたんですが不要になって結局使わなかったので、供養のために置いておきます。

仕様

from download import download

url = 'http://download.hogehoge~~~~~~~~~~~~~~~~.zip'
download(url, './donwloaded_file.zip') # urlと保存先のパス、ファイル名

みたいに書くと、
スクリーンショット 2019-02-16 11.51.52.png
こんな感じにコンソールに出る。

コード

ダウンロードとファイルの保存自体はurllib.request.urlretrieveを使います。
ここでダウンロードが進むごとに呼ばれる引数のコールバック関数に、
プログレスバーを表示させる関数(progress_print)を渡します。
色をつけるためにcoloramaを使用しています。

バーを短くしたければmax_barの値を小さくすればいいです。

download.py
import urllib.request
from colorama import init, Fore, Back, Style

# 進捗を表示させるためのコールバック関数
# イメージ:[=====>    ] 50.54% ( 1050KB )
def progress_print(block_count, block_size, total_size):
  percentage = 100.0 * block_count * block_size / total_size
  # 100より大きいと見た目が悪いので……
  if percentage > 100:
    percentage = 100
  # バーはmax_bar個で100%とする
  max_bar = 50
  bar_num = int(percentage / (100 / max_bar))
  progress_element = '=' * bar_num
  if bar_num != max_bar:
    progress_element += '>'
  bar_fill = ' ' # これで空のとこを埋める
  bar = progress_element.ljust(max_bar, bar_fill)
  total_size_kb = total_size / 1024
  print(
    Fore.LIGHTCYAN_EX,
    f'[{bar}] {percentage:.2f}% ( {total_size_kb:.0f}KB )\r',
    end=''
  )

def download(url, filepath_and_filename):
  init()
  print(Fore.LIGHTGREEN_EX, 'download from:', end="")
  print(Fore.WHITE, url)
  # コールバックでprogress_printを呼んで進捗表示
  urllib.request.urlretrieve(url, filepath_and_filename, progress_print)
  print('') # 改行
  print(Style.RESET_ALL, end="")

使用イメージ

index.py
from download import download

url = 'http://download.hogehoge~~~~~~~~~~~~~~~~.zip'
download(url, './donwloaded_file.zip')

※この使用イメージのファイルの階層はこんな感じ。

projectroot/
  ├download.py
  └index.py ← これを実行した
12
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13