2017-05-07 3 views
3

Bei der Verwendung von urllib.request.urlretrieve habe ich mich gefragt, ob es eine Möglichkeit gibt, den Status des Downloads in der Konsole zusammen mit Informationen wie die Dateigröße zu sehen?Wie wird der Downloadprozess angezeigt?

Hier ist der Code, den ich testete auf.

#!/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!') 

Antwort

3

Es gibt nichts gebaut Sie würden es selbst zu schreiben. Zum Glück ist es nicht zu schwierig. Sie müssen nur die Länge des Inhalts aus der Kopfzeile lesen und dann die Antwort durch Chunks lesen. Hier ist der 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) 

Es ist wichtig zu beachten, dass ich verwenden urllib.request.urlopen weil urllib2.request.retrievelegacy betrachtet und wird bald veraltet sein.

+0

Danke für Ihre gute Antwort Ich verstehe jetzt die Logik dahinter tun, aber ich weiß, dass urlopen nur die URL ohne den Dateinamen nehmen, so ist es die einzige Möglichkeit, urlretrieve ersetzen? – SalahGfx

Verwandte Themen