2013-10-08 54 views
3

更新#1如何通過ftp(通過監控和重新連接)在python下載大文件?

穩定連接(如本地網絡或企業內部網)的作品相當不錯的問題的代碼。

更新#2

我實現了FTPClient類FTPLIB可以:

  1. 監控下載進度
  2. 重新連接在超時的情況下或斷開
  3. 使得多次嘗試下載文件
  4. 顯示當前下載速度。

重新連接後,它將繼續從斷開點(如果FTP服務器支持它)的下載過程。有關詳情,請參閱下面的答案。


問題

我要實現通過FTP蟒蛇其每日下載一堆大文件(0.3-1.5Gb每個文件* 200-300文件)任務,然後做一些處理與文件。我通過ftplib做到了。但有時會掛起,並且無法完成某些文件的下載。要解決我開始KEEPALIVE設置播放的問題,但我還沒有收到良好的效果

with closing(ftplib.FTP()) as ftp: 
    try: 
     ftp.connect(self.host, self.port, 30*60) #30 mins timeout 
     # print ftp.getwelcome() 
     ftp.login(self.login, self.passwd) 
     ftp.set_pasv(True) 
     ftp.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) 
     ftp.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 75) 
     ftp.sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 60) 
     with open(local_filename, 'w+b') as f: 
      res = ftp.retrbinary('RETR %s' % orig_filename, f.write) 

      if not res.startswith('226 Transfer complete'): 
       logging.error('Downloaded of file {0} is not compile.'.format(orig_filename)) 
       os.remove(local_filename) 
       return None 

     os.rename(local_filename, self.storage + filename + file_ext) 
     ftp.rename(orig_filename, orig_filename + '.copied') 

     return filename + file_ext 

    except: 
      logging.exception('Error during download from FTP') 

詳細

  • 通常需要7-15分鐘下載一個文件。
  • FTP服務器總是在日誌中顯示我完全下載文件的文件,但客戶端部分掛起。不是每次,但不時。

問題

  • 但願這是因爲斷開的?
  • 如何實現對下載過程的監視,如果它斷開
+0

如果您使用獨立的FTP程序,它可以工作嗎?在完成或失敗之前需要多長時間?你的Python程序能存活多久? –

+0

#1.我沒有嘗試通過獨立的FTP程序下載大文件,只有很小的文件。我只能在負載很低的情況下進行測試,但我會測試它。 #2 7-15分鐘,但如果python任務掛起,它可以保持超過1小時,我沒有再等待。 –

+0

儘管我已經問過第二次了,但你仍然沒有回答我問過你的第一個問題,並且這個問題的評論是有效的。我敢打賭,這就是爲什麼這個問題得到低估的原因之一。這當然是爲什麼我低估了。 –

回答

7

因爲我找不到什麼好的建議或代碼樣本重新連接的情況下,我實現了自己的解決方案。 非常感謝Stackoverflow社區對我在代碼中使用的一些想法。由於代碼的大小(〜120行),我將代碼放到GitHub(pyFTPclient)。

我測試了質量差的網絡(包括3G移動互聯網)的解決方案,它對我來說工作正常。但它當然可能有一些錯誤。

我將不勝感激任何意見或建議。 預先感謝您。

+3

感謝您分享您的代碼。我還爲ftplib實現了一個小的包裝器,它顯示文件傳輸的進度(儘管它不會重試丟失的連接),在這裏:https://bitbucket.org/dkurth/ftp_connection.py –

+2

這裏是另一個用於添加進度條的解決方案用python下載ftp:https://code.activestate.com/recipes/577871-python-progressbar/ – asmaier