2016-10-06 3 views
0

Python 2.7.Как загрузить тот же файл дважды? (urlretrieve issue)

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

Вы не указываете файл назначения в 'urlretrieve()', так что это возможно во второй раз, когда он не работает, потому что файл уже существует? См. Http://stackoverflow.com/questions/37455933/the-default-path-of-python-urlretrieve-downloading-file-via-http – sashoalm

+0

Это не проблема. Я редактировал вопрос, добавляя разные файлы назначения. Результат тот же. – Dado

ответ

0

К сожалению, urlretrieve имеет что-то неточное в Python2.7. Вызывается urlretrieve, многократно работает по HTTP, а не FTP в Python2.7. Причина в том, что ftplib отправляет PASV по ftplib снова и снова. К счастью, мы можем вызвать urlcleanup перед urlretrieve при загрузке файла по ftp. И документация here.

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") 
+0

Да, это именно то, что я тестировал. Целевые локальные файлы были разными. – Dado

+0

@Dado Так почему же вы не опубликовали свой фактический код в своем вопросе в первую очередь? – sashoalm

+0

Да, это была моя ошибка, что я забыл о вторых параметрах, Извините за это. Но я все еще думаю, что добавление к этому вопросу кучи os.path.joins, циклов, утверждений и т. Д. Не делает никакой ценности. Проблема, безусловно, связана с urlretrieve. – Dado

Смежные вопросы