从FTP下载第二个文件失败

3

我希望能在Python中从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

我应该怎么做?


你尝试过使用内置模块 ftplib 吗? - Sam Chats
1个回答

5
这是Python 2.7中urllib的一个错误,报告详情请参见此处。造成这个问题的原因在这里有详细解释。
当用户尝试从同一目录下载相同的文件或另一个文件时,密钥(主机、端口、目录)保持不变,因此open_ftp()会跳过FTP初始化。由于跳过了初始化步骤,之前的FTP连接被重用,当向服务器发送新命令时,服务器首先发送之前的确认码。这导致了一个多米诺骨牌效应,每个响应都被延迟一个,最终导致我们从parse227()得到异常。
一个可能的解决方法是清除上一次请求所建立的缓存。您可以在多次调用urlretrieve之间使用urllib.urlcleanup()方法来实现,具体请参见这里
希望这能帮助您!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接