2017-06-24 43 views
1

我想从python下载FTP中的多个文件。我的代码工作时,我只是下载1个文件,但不适用于多个!从ftp下载第二个文件失败

import urllib 
urllib.urlretrieve('ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/oa_package/00/00/PMC1790863.tar.gz', 'file1.tar.gz') 
urllib.urlretrieve('ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/oa_package/00/00/PMC2329613.tar.gz', 'file2.tar.gz') 

错误说:

Traceback (most recent call last): 
    File "/home/ehsan/dev_center/bigADEVS-bknd/daemons/crawler/ftp_oa_crawler.py", line 3, in <module> 
    urllib.urlretrieve('ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/oa_package/00/00/PMC2329613.tar.gz', 'file2.tar.gz') 
    File "/usr/lib/python2.7/urllib.py", line 98, in urlretrieve 
    return opener.retrieve(url, filename, reporthook, data) 
    File "/usr/lib/python2.7/urllib.py", line 245, in retrieve 
    fp = self.open(url, data) 
    File "/usr/lib/python2.7/urllib.py", line 213, in open 
    return getattr(self, name)(url) 
    File "/usr/lib/python2.7/urllib.py", line 558, in open_ftp 
    (fp, retrlen) = self.ftpcache[key].retrfile(file, type) 
    File "/usr/lib/python2.7/urllib.py", line 906, in retrfile 
    conn, retrlen = self.ftp.ntransfercmd(cmd) 
    File "/usr/lib/python2.7/ftplib.py", line 334, in ntransfercmd 
    host, port = self.makepasv() 
    File "/usr/lib/python2.7/ftplib.py", line 312, in makepasv 
    host, port = parse227(self.sendcmd('PASV')) 
    File "/usr/lib/python2.7/ftplib.py", line 830, in parse227 
    raise error_reply, resp 
IOError: [Errno ftp error] 200 Type set to I 

我该怎么办?

+0

您是否尝试过使用'ftplib'内置模块? –

回答

3

这是python 2.7中urllib中的一个bug。已报告here。同样是背后的原因解释here

现在,当用户试图下载同一个文件或 同一目录下的另一个文件,关键(主机,端口,迪尔斯)保持不变,所以 open_ftp()跳过ftp初始化。由于这种跳过,以前的FTP连接被重新使用,并且当新的命令被发送到服务器 时,服务器首先发送先前的ACK。这将导致多米诺骨牌效应 和每个响应得到一个延迟,我们从parse227得到一个异常 ()

一个可能的解决方案是明确规定,可以由以前的电话建立起来的高速缓存。您可以在您的urlretrieve调用之间使用urllib.urlcleanup()方法调用,如前所述here

希望这会有所帮助!