How can I see the download progress?

While using urllib.request.urlretrieve

it, I was wondering if there is a way to see the download status printed to the console as well as information such as file size?

Here's the code I tested:

#!/usr/bin/env python3.5.2

import urllib.request
import os


# make sure to change the directory before you test the code
directory = r'C:\Users\SalahGfx\Desktop\Downloads'

url = 'https://upload.wikimedia.org/wikipedia/en/d/d8/C4D_Logo.png' 

def get_name_path():
    image_name = url.split('/')[-1]
    return os.path.join(directory, image_name)

urllib.request.urlretrieve(url, get_name_path())

print('The Image has been downloaded!')

      

+3


source to share


1 answer


There is nothing built in. You would need to write it yourself. Fortunately, this is not too difficult. You just need to read the length of the content from the header and then read the response in chunks. Here's the code

import urllib2, sys

def chunk_report(bytes_so_far, chunk_size, total_size):
    percent = float(bytes_so_far) / total_size
    percent = round(percent*100, 2)
    sys.stdout.write("Downloaded %d of %d bytes (%0.2f%%)\r" % 
                     (bytes_so_far, total_size, percent))

    if bytes_so_far >= total_size:
       sys.stdout.write('\n')

def chunk_read(response, chunk_size=8192, report_hook=None):
    total_size = response.info().getheader('Content-Length').strip()
    total_size = int(total_size)
    bytes_so_far = 0

    while 1:
       chunk = response.read(chunk_size)
       bytes_so_far += len(chunk)

       if not chunk:
          break

       if report_hook:
          report_hook(bytes_so_far, chunk_size, total_size)

    return bytes_so_far

def get_name_path():
    image_name = url.split('/')[-1]
    return os.path.join(directory, image_name)

# make sure to change the directory before you test the code
directory = r'C:\Users\SalahGfx\Desktop\Downloads'

url = 'https://upload.wikimedia.org/wikipedia/en/d/d8/C4D_Logo.png' 

response = urllib.request.urlopen(url, get_name_path())
chunk_read(response, report_hook=chunk_report)

      



It is important to note that I used urllib.request.urlopen

because it urllib2.request.retrieve

is considered legacy and will soon be deprecated.

+3


source







All Articles