首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过ftp下载python中的大文件(包括监视和重新连接)?

如何通过ftp下载python中的大文件(包括监视和重新连接)?
EN

Stack Overflow用户
提问于 2013-10-08 10:53:33
回答 1查看 7.9K关注 0票数 6

更新#1

问题中的代码对于稳定的连接(比如本地网络或intranet)非常有用。

更新#2

我用ftplib实现了FTPClient类,它可以:

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

重新连接后,它继续从断开点(如果FTP服务器支持它)下载过程。详情见下面的答案。

问题

我必须在python上实现任务,它每天通过FTP下载一堆大文件(每个文件0.3-1.5GB* 200-300文件),然后对这些文件进行一些处理。我是通过ftplib做的。但有时它会挂起,无法完成某些文件的下载。为了解决这个问题,我开始使用KEEPALIVE设置,但我仍然没有收到好的结果。

代码语言:javascript
复制
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服务器总是在日志中显示文件已完全下载,但客户端部分挂起。不是每次都是,而是时不时地。

问题

  • 可能是因为断电吗?
  • 如何为下载过程实现监视器,并在断开连接时重新连接
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-18 19:11:23

由于找不到任何好的建议或代码示例,所以我实现了自己的解决方案。非常感谢Stackoverflow社区提供了一些我在代码中使用的想法。由于代码的大小(~ 120行),我将代码放入GitHub (pyFTPclient)。

我在劣质网络(包括3G移动互联网)上测试了解决方案,它对我来说很好。当然,它可能会有一些bug。

如有任何意见或建议,我将不胜感激。提前谢谢你。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19245769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档