gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:45:22 25 4
gpt4 key购买 nike

更新 #1

问题中的代码对于稳定的连接工作得很好(比如本地网络或内联网)。

更新 #2

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

  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 filename + file_ext

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

详情

  • 下载文件通常需要 7-15 分钟。
  • FTP 服务器总是在日志中显示文件已完全下载,但客户端挂起。不是每次,而是时不时。

问题

  • 可能是因为断开连接?
  • 如何为下载过程实现监控并在断开连接时重新连接

最佳答案

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

我在质量较差的网络(包括 3G 移动互联网)上测试了该解决方案,它对我来说工作正常。但当然它可能有一些错误。

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

关于python - 如何通过 ftp 在 python 中下载大文件(带监控和重新连接)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19245769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com