Python 2.7。
from urllib import urlretrieve
urlretrieve("ftp://ftp.wwpdb.org/pub/pdb/data/structures/divided/mmCIF/27/127d.cif.gz", "file1")
urlretrieve("ftp://ftp.wwpdb.org/pub/pdb/data/structures/divided/mmCIF/27/127d.cif.gz", "file2")
第一次下载正确但第二次失败:
Traceback (most recent call last):
File "C:/Jacek/Python/untitled/test2.py", line 3, in <module>
urlretrieve("ftp://ftp.wwpdb.org/pub/pdb/data/structures/divided/mmCIF/27/127d.cif.gz", "file2")
File "C:\Python27\lib\urllib.py", line 98, in urlretrieve
return opener.retrieve(url, filename, reporthook, data)
File "C:\Python27\lib\urllib.py", line 245, in retrieve
fp = self.open(url, data)
File "C:\Python27\lib\urllib.py", line 213, in open
return getattr(self, name)(url)
File "C:\Python27\lib\urllib.py", line 558, in open_ftp
(fp, retrlen) = self.ftpcache[key].retrfile(file, type)
File "C:\Python27\lib\urllib.py", line 906, in retrfile
conn, retrlen = self.ftp.ntransfercmd(cmd)
File "C:\Python27\lib\ftplib.py", line 334, in ntransfercmd
host, port = self.makepasv()
File "C:\Python27\lib\ftplib.py", line 312, in makepasv
host, port = parse227(self.sendcmd('PASV'))
File "C:\Python27\lib\ftplib.py", line 830, in parse227
raise error_reply, resp
IOError: [Errno ftp error] 200 TYPE is now 8-bit binary
在python 3上(带有相应版本的urlretrieve),这可以正常工作 - 两次下载都成功了。
这是在Python 2.7上解决这个问题的方法吗?
(当然,你可以说下载两次相同的文件是没有意义的。我同意。我在测试试图下载具有不同参数的文件的模块时遇到了这个问题(因为它与问题,我简化了示例代码)我只是对这种奇怪的行为感到惊讶)
答案 0 :(得分:1)
不幸的是,urlretrieve在Python2.7中有些不对劲。 被称为urlretrieve的HTTP反复工作,而不是Python2.7中的FTP。 原因是ftplib一次又一次地通过ftplib发送PASV。 幸运的是,我们可以在urlretrieve之前通过ftp下载文件时调用urlcleanup。 文档为here。
答案 1 :(得分:0)
来自urlretrieve for Python2的文档:
If the URL points to a local file, or a valid cached copy of the object exists, the object is not copied
所以第一印象是图书馆将避免两次下载文件。
您是否尝试将文件写入不同的文件?
from urllib import urlretrieve
urlretrieve("ftp://ftp.wwpdb.org/pub/pdb/data/structures/divided/mmCIF/27/127d.cif.gz", "/tmp/file1.gz")
urlretrieve("ftp://ftp.wwpdb.org/pub/pdb/data/structures/divided/mmCIF/27/127d.cif.gz", "/tmp/file2.gz")