2017-06-24 19 views
1

FTPから複数のファイルをpythonでダウンロードしたいと思います。私のコードは1つのファイルをダウンロードするだけで動作しますが、複数のファイルでは動作しません!ftpから2番目のファイルをダウンロードできません

import urllib 
urllib.urlretrieve('ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/oa_package/00/00/PMC1790863.tar.gz', 'file1.tar.gz') 
urllib.urlretrieve('ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/oa_package/00/00/PMC2329613.tar.gz', 'file2.tar.gz') 

エラーは言う:

Traceback (most recent call last): 
    File "/home/ehsan/dev_center/bigADEVS-bknd/daemons/crawler/ftp_oa_crawler.py", line 3, in <module> 
    urllib.urlretrieve('ftp://ftp.ncbi.nlm.nih.gov/pub/pmc/oa_package/00/00/PMC2329613.tar.gz', 'file2.tar.gz') 
    File "/usr/lib/python2.7/urllib.py", line 98, in urlretrieve 
    return opener.retrieve(url, filename, reporthook, data) 
    File "/usr/lib/python2.7/urllib.py", line 245, in retrieve 
    fp = self.open(url, data) 
    File "/usr/lib/python2.7/urllib.py", line 213, in open 
    return getattr(self, name)(url) 
    File "/usr/lib/python2.7/urllib.py", line 558, in open_ftp 
    (fp, retrlen) = self.ftpcache[key].retrfile(file, type) 
    File "/usr/lib/python2.7/urllib.py", line 906, in retrfile 
    conn, retrlen = self.ftp.ntransfercmd(cmd) 
    File "/usr/lib/python2.7/ftplib.py", line 334, in ntransfercmd 
    host, port = self.makepasv() 
    File "/usr/lib/python2.7/ftplib.py", line 312, in makepasv 
    host, port = parse227(self.sendcmd('PASV')) 
    File "/usr/lib/python2.7/ftplib.py", line 830, in parse227 
    raise error_reply, resp 
IOError: [Errno ftp error] 200 Type set to I 

私は何をすべき?

+0

'ftplib'組み込みモジュールを使ってみましたか? –

答えて

3

python 2.7のurllibのバグです。報告されたhere。同じ理由は)ユーザーが同じファイルまたは 同じディレクトリから別のファイルをダウンロードしようとすると、キー(ホスト、ポート、dirsには)(同じよう open_ftpまま、here

を説明されていますftpの初期化をスキップします。このスキップのために、 以前のFTP接続が再利用され、新しいコマンドがサーバ に送信されると、サーバは先に前のACKを送信します。これは、ドミノ 効果をもたらし、それぞれの応答は1だけ遅れますと、我々は(parse227から例外 を取得)

可能な解決策は、以前の呼び出しによって構築された可能性のあるキャッシュをクリアすることです。前述のhereと同様に、urlretrieveの呼び出しの間にurllib.urlcleanup()メソッド呼び出しを使用することができます。

希望すると便利です。

関連する問題