首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何下载同一文件两次?(检索问题)

如何下载同一文件两次?(检索问题)
EN

Stack Overflow用户
提问于 2016-10-06 06:52:12
回答 2查看 644关注 0票数 0

Python 2.7。

代码语言:javascript
运行
复制
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")

第一次下载正确,但第二次下载失败:

代码语言:javascript
运行
复制
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(有相应版本的url检索)上,这一工作就像预期的一样--这两个下载都成功了。

这是在Python2.7上解决这个问题的一种方法吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-06 16:02:40

不幸的是,Python2.7中的urlretrieve有问题。在Python2.7中,名为url检索的重复工作由HTTP,而不是FTP工作。原因是ftplib通过ftplib一次又一次地发送PASV。幸运的是,当ftp下载文件时,我们可以在call检索之前调用urlcleanup。文档是这里

票数 1
EN

Stack Overflow用户

发布于 2016-10-06 07:00:04

来自用于Python2的for检索的文档

If the URL points to a local file, or a valid cached copy of the object exists, the object is not copied

因此,第一印象是库将避免下载文件两次。

你试过把文件写在不同的文件上吗?

代码语言:javascript
运行
复制
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")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39889389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档