【问题标题】:resuming download file ftp python3.*恢复下载文件 ftp python3.*
【发布时间】:2019-06-23 17:18:57
【问题描述】:

您需要提取一个文件 (1-7Gb)。网络周期性的掉线,所以需要实现恢复的方法。例如,在 1 个通信会话中下载了 20% 网络消失,2 个会话出现并且下载从 20% 等。请在 Python 中帮助刚开始理解。我知道您可以像这样下载文件

import ftplib
path = ‘/’
filename = ‘100KB.zip’
ftp = ftplib.FTP(“speedtest.tele2.net”) 
ftp.login(“anonymous”, “”) 
ftp.cwd(path)
ftp.retrbinary(“RETR ” + filename ,open(filename, ‘wb’).write)
print(“. Загрузка успешно окончена!\n”)
ftp.quit()

如何下​​载缺少网络的文件?

【问题讨论】:

  • 代码中的引号看起来很古怪,但我想它们在您的实际代码中是正确的。

标签: python file ftp


【解决方案1】:

retrbinary 命令接受可选的rest 参数,该参数应包含一个字符串,指示重新开始传输的字节偏移量。这在transfercmd documentation中有更详细的描述;一些文件传输命令支持这个可选参数。

此功能是可选的,因此服务器可能不支持它;您应该准备好处理错误返回,并返回到获取整个文件(或中止)。

您的调用代码当然应该设置为附加到未完成的文件,而不是覆盖它!

未经测试,不在我的电脑上:

import ftplib
import os

path = '/'
filename = '100KB.zip'
ftp = ftplib.FTP("speedtest.tele2.net") 
ftp.login("anonymous", "") 
ftp.cwd(path)
if os.path.exists(filename):
    restarg = {'rest': str(os.path.getsize(filename))}
else:
    restarg = {}
ftp.retrbinary("RETR " + filename ,open(filename, 'ab').write, **restarg)
print("untranslated string in some Slavic language?\n")
ftp.quit()

Python **kwargs 表示法允许我们使用字典在函数调用中传递关键字参数。如果文件不存在,我们传递一个空字典(没有额外的关键字参数),否则传递一个包含关键字'rest' 及其值的dict。在这两种情况下,我们都使用文件模式'ab',它将附加到现有的二进制文件,或者简单地创建一个新的二进制文件,然后打开它进行写入。

【讨论】:

  • 您的代码给出 ERROR: Traceback (last recent call last): File "D:/pyt/venv/test.py", line 13, in ftp.retrbinary("RETR" + filename ,open(filename, 'ab').write, **restarg) ftplib.error_perm: 550 无法打开文件。
  • 我在您输入时修复了引用。但是,该错误看起来像您的示例文件名在服务器上不存在。
  • 非常感谢。如何跟踪下载文件的百分比?打印?有联系吗?
  • 你可以传入一个更复杂的回调来代替open(...).write,每个块都会调用它;默认块大小为 8192。我不明白你的第二个问题;但无论如何,(也许接受这个答案,或者发布您自己的答案并接受,并且)如果您有新问题,请开始一个新问题。
  • 如何将文件从计算机写入 FTP 服务器?
猜你喜欢
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多