0

私はPythonプログラミングの初心者です。私の質問は、同時にいくつかのファイルをダウンロードする方法です。ファイルごとではなく、ftp 上の 1 つのディレクトリから同時に。今、私はこのスクリプトを使用していますが、このコードを再構築する方法がわかりません:

  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)

それはうまくいきますが、私が必要とするものではありません。

4

1 に答える 1

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 URL が含まれており、URL からファイル名部分ftp://example.com/path/to/fileurl2filename()抽出します。

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
于 2013-05-11T20:17:37.707 に答える