Python ftplib和storbinary

use*_*312 3 python ftplib

试图了解其ftplib工作原理.

我正在尝试将文件保存到FTP服务器并实现回调.

文件说:

FTP.storbinary(command, file[, blocksize, callback, rest])
Run Code Online (Sandbox Code Playgroud)

callback 函数定义如文档中所示:

为每个接收到的数据块调用回调函数,使用单个字符串参数给出数据块.

我该如何实现这个回调?retrbinary(读取文件)上的示例回调可能如下所示:

def handle(block):
    f.write(block)
    print ".", 
Run Code Online (Sandbox Code Playgroud)

这将显示正在下载的文件的进度,f即文件对象.

但我对如何实现这一点感到茫然storbinary.

有关如何做到这一点的任何建议?我知道block参数,但如何通过上传调整?

更新:

我有一个回调上传为:

def handle(block):
    f.read(block)
    print ".",
Run Code Online (Sandbox Code Playgroud)

但正如预期的那样,它给出了错误:

an integer is required

传球int(block)也行不通.

bee*_*onk 5

如果你的回调是

def handle(block):
    f.write(block)
    print ".", 
Run Code Online (Sandbox Code Playgroud)

Python具有可以作为params传递的第一类函数 - 这是回调的一点 - 您将函数作为param传递给storbinary调用 -

ftp.storbinary(command="stor someFileNameOnServer", file=open("localFile",'rb'), callback=handle,blocksize=1024)
Run Code Online (Sandbox Code Playgroud)

从python doc,

callback是一个可选的单参数callable,在每个数据块发送后调用它.

它纯粹是一种后处理方法,例如显示传输状态,它是在每个数据块发送后调用的.在发送每1024字节数据之后将调用它.

要实现转移状态,这样的事情 -

sizeWritten = 0
totalSize = someMethodToGetTotalBytesInFile()
def handle(block):
    global sizeWritten
    sizeWritten += 1024
    percentComplete = sizeWritten / totalSize
    print "%s percent complete" %str(sizeWritten / totalSize)
Run Code Online (Sandbox Code Playgroud)

os.path.getsize将为您提供文件的总大小(以字节为单位).