2016-10-06 11 views
0

Python 2.7。同じファイルを2回ダウンロードするには? (urlretrieveの問題)

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

最初のダウンロードが正常に行くが、2番目に障害が発生した:

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 
(urlretrieveの該当するバージョンで)のpython 3オン

これは期待通りに動作します - 両方のダウンロードが成功しました。

これをPython 2.7で解決する方法はありますか?

(もちろん、同じファイルを2回ダウンロードすることは意味をなさないと言うこともできますが、私は同意します)モジュールをテストしているときにこのパラメータを変更してファイルをダウンロードしようとしました。問題は、私は例のコードを簡素化)し、私はちょうどurlretrieve for Python2のドキュメントからこの奇妙な振る舞い)

+0

あなたは 'urlretrieve()'で目的地ファイルを指定していないので、ファイルがすでに存在するために2度目に失敗する可能性がありますか? http://stackoverflow.com/questions/37455933/the-default-path-of-python-urlretrieve-downloading-file-via-http – sashoalm

+0

を参照してください。それは問題ではありません。異なる宛先ファイルを追加する質問を編集しました。結果は同じです。 – Dado

答えて

0

残念ながら、urlretrieveはPython2.7で何か問題があります。 urlretrieveは、Python2.7のFTPではなく、HTTPで繰り返し動作します。 なぜならftplibはftplibによってPASVを何度も何度も送るからです。 幸いにも、ftlでファイルをダウンロードするときにurlretrieveの前にurlcleanupを呼び出すことができます。 ドキュメントはhereです。

0

とびっくりしました:

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

ので、第一印象は、ライブラリがダウンロードを避けるということですファイルを2回

ファイルを別のファイルに書き込もうとしましたか?

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

はい、私は2番目のパラメータを忘れてしまったのは間違いでした。申し訳ありません。しかし、私はまだこの質問にos.path.joins、loops、assertionsなどの束を追加することは価値がないと考えています。問題は確かにurlretrieveです。 – Dado

関連する問題