它告诉你在retrbinary
方法中没有提供足够的参数。
文档指明,你还必须提供一个'callback'函数,用于在接收到每个数据块时进行调用。你需要编写一个回调函数并对其给出的数据执行某些操作 (例如将其写入文件、在内存中收集等)。
作为附注,你可能会问为什么它说有 '3' 个必需的参数而不是只有 '2'。这是因为 Python 在实例方法上要求 'self' 参数,但你已经使用 ftp
对象引用隐式传递了它。
编辑 - 看起来我可能没有完全回答你的问题。
对于command
参数,你应该传递一个有效的RETR命令,而不是一个列表。
filenames = ['a.dat', 'b.dat']
# Iterate through all the filenames and retrieve them one at a time
for filename in filenames:
ftp.retrbinary('RETR %s'
对于callback
,您需要传递一个可调用的对象(通常是某种函数),该对象接受单个参数。这个参数是正在检索的文件数据块。我说“块”,因为当您在移动大型文件时,很少希望在内存中保存整个文件。该库被设计为在接收到数据块时迭代地调用您的回调函数。这使您能够写出文件的数据块,因此您只需在任何给定时间保留相对较少的数据。
我的示例有点复杂,但您的回调可以是在已打开的文件中编写的for循环内部的闭包:
import os
filenames = ['a.dat', 'b.dat']
for filename in filenames:
local_filename = os.path.join('/tmp', filename)
with open(local_filename, 'wb') as f:
def callback(data):
f.write(data)
ftp.retrbinary('RETR %s' % filename, callback)
这也可以用更简洁的lambda语句来完成,但是我发现对于刚接触Python和一些函数式概念的人来说,第一个示例更容易理解。尽管如此,这里是使用lambda而不是普通函数的ftp调用:
ftp.retrbinary('RETR %s'
我想你甚至可以这样做,直接将文件的
write
实例方法作为回调函数传递:
ftp.retrbinary('RETR %s' % filename, f.write)
这三个例子应该是类似的,希望通过对它们的追踪能帮助你理解正在发生什么。
出于示例的目的,我省略了任何类型的错误处理。
此外,我没有测试上述代码,如果它不起作用,请告诉我,我会尽力澄清。
retrbinary
和callback
如何工作的内容。我不知道有比Python文档更好的文档,但我同意文档假定您具有一些Python的工作知识。如果这回答了您的问题,请确保将其标记为已接受,以供未来的旅行者参考。 - Joe Holloway