2013-04-22 4 views
-1

Я новичок в программировании на Python. Мой вопрос в том, как загрузить несколько файлов одновременно. Не файл по файлу, а одновременно из одного каталога на ftp. Теперь я использую этот сценарий, но я не знаю, как я могу восстановить этот код:Как загрузить несколько файлов одновременно из ftp в Python

filenames = [] 
    ftp.retrlines("NLST", filenames.append) 
    print filenames 
    print path 
    for filename in filenames: 
     local_filename = filename 
     print filename 
     print local_filename 
     f = open(local_filename, "wb") 

     s = ftp.size(local_filename)  
     sMB = s/(1024*1024) 
     print "file name: " + local_filename + "\nfile size: " + str(sMB) + " MB" 
     ftp.retrbinary("RETR %s" % local_filename, f.write) 
    print "\n Done :) " 
    time.sleep(2) 
    f.close() 
    ftp.quit() #closing connection 
    time.sleep(5) 

Он отлично работает, но не то, что мне нужно.

+1

Вы пробовали [темы] (http://docs.python.org/2/library/threading.html)? – bobrobbob

ответ

5

Вы можете использовать несколько потоков или процессов. Убедитесь, что вы создаете новый объект ftplib.FTP в каждом потоке. Самый простой способ (код-накрест) является использование multiprocessing.Pool:

#!/usr/bin/env python 
from multiprocessing.dummy import Pool # use threads 
try: 
    from urllib import urlretrieve 
except ImportError: # Python 3 
    from urllib.request import urlretrieve 

def download(url): 
    url = url.strip() 
    try: 
     return urlretrieve(url, url2filename(url)), None 
    except Exception as e: 
     return None, e 

if __name__ == "__main__": 
    p = Pool(20) # specify number of concurrent downloads 
    print(p.map(download, open('urls'))) # perform parallel downloads 

где urls содержит FTP ссылки на файлы для загрузки, например, ftp://example.com/path/to/file и url2filename() извлекает имя файла часть из URL-адреса, например:

import os 
import posixpath 
try: 
    from urlparse import urlsplit 
    from urllib import unquote 
except ImportError: # Python 3 
    from urllib.parse import urlsplit, unquote 

def url2filename(url, encoding='utf-8'): 
    """Return basename corresponding to url. 

    >>> print url2filename('http://example.com/path/to/dir%2Ffile%C3%80?opt=1') 
    fileÀ 
    """ 
    urlpath = urlsplit(url).path 
    basename = posixpath.basename(unquote(urlpath)) 
    if os.path.basename(basename) != basename: 
     raise ValueError(url) # reject 'dir%5Cbasename.ext' on Windows 
    return basename 
Смежные вопросы