2017-10-17 3 views
0

Je veux utiliser des discussions pour télécharger plusieurs fichiers à la fois.télécharger des fichiers avec l'événement

Voici ce que j'ai essayé:

import eventlet 
from urllib.request import urlopen 

def fetch(url, fl): 
    urllib.request.urlretrieve(url, fl) 
    return url, fl 

pool = eventlet.GreenPool() 
for url, fl in pool.imap(fetch, dlList, dlFList): 
    print("downloaded " + url + " to " + fl) 

dList est une liste de urls et dlFList est une liste de fichiers de destination.

Cependant, je reçois l'erreur:

TypeError: fetch() missing 1 required positional argument: 'fl'

Comment cette pool.imap

Répondre

0

Imaginez la fonction fetch est en lecture seule (par exemple dans d'autres bibliothèques) Je passe bien plus de 1 argument, vous Devrait imap sur une fonction intermédiaire.

pool.imap(lambda (u,f): fetch(u, f), zip(dlList, dlFList)) 

mais comme vous pouvez contrôler la fonction de mappage, modifiez-la pour accepter un tuple d'URL et de nom de fichier.

def fetch(t): 
    url, filename = t 
    urllib.request.urlretrieve(url, filename) 
    return t 

pool.imap(fetch, zip(dlList, dlFList)) 

Vous n'avez pas envie de taper? Rendre le nom de fichier calculable à partir de l'URL, par exemple, via une recherche par dictionnaire ou un traitement de chaîne.

url_filename_map = dict(zip(dlList, dlFList)) # or build dict some other way 

def fetch(url): 
    filename = url_filename_map[url] 
    # or 
    filename = '/path/prefix/' + hashlib.md5(url).hexdigest() 
    urllib.request.urlretrieve(url, filename) 
    return url, filename 

pool.imap(fetch, url_filename_map) # same as imap(fetch, urlmap.keys())