更新#1如何通過ftp(通過監控和重新連接)在python下載大文件?
在穩定連接(如本地網絡或企業內部網)的作品相當不錯的問題的代碼。
更新#2
我實現了FTPClient
類FTPLIB可以:
- 監控下載進度
- 重新連接在超時的情況下或斷開
- 使得多次嘗試下載文件
- 顯示當前下載速度。
重新連接後,它將繼續從斷開點(如果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服務器總是在日誌中顯示我完全下載文件的文件,但客戶端部分掛起。不是每次,但不時。
問題
- 但願這是因爲斷開的?
- 如何實現對下載過程的監視,如果它斷開
如果您使用獨立的FTP程序,它可以工作嗎?在完成或失敗之前需要多長時間?你的Python程序能存活多久? –
#1.我沒有嘗試通過獨立的FTP程序下載大文件,只有很小的文件。我只能在負載很低的情況下進行測試,但我會測試它。 #2 7-15分鐘,但如果python任務掛起,它可以保持超過1小時,我沒有再等待。 –
儘管我已經問過第二次了,但你仍然沒有回答我問過你的第一個問題,並且這個問題的評論是有效的。我敢打賭,這就是爲什麼這個問題得到低估的原因之一。這當然是爲什麼我低估了。 –