如何下载两次相同的文件? (urlretrieve issue)

时间:2016-10-06 06:52:12

标签: python python-2.7

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上解决这个问题的方法吗?

(当然,你可以说下载两次相同的文件是没有意义的。我同意。我在测试试图下载具有不同参数的文件的模块时遇到了这个问题(因为它与问题,我简化了示例代码)我只是对这种奇怪的行为感到惊讶)

2 个答案:

答案 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")