相关疑难解决方法(0)

如何通过ftp在python中下载大文件(带监控和重新连接)?

更新#1

问题中的代码非常适合稳定连接(如本地网络或内部网).

更新#2

FTPClient使用ftplib 实现了这个类,它可以:

  1. 监控下载进度
  2. 在超时或断开连接时重新连接
  3. 多次尝试下载文件
  4. 显示当前下载速度.

重新连接后,它将从断开连接点继续下载过程(如果FTP服务器支持它).有关详情,请参阅下面的答案.


我必须在python上实现任务,每天通过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 …
Run Code Online (Sandbox Code Playgroud)

python ftplib

5
推荐指数
1
解决办法
5635
查看次数

标签 统计

ftplib ×1

python ×1