Python ftplib и storbinary - PullRequest
       4

Python ftplib и storbinary

3 голосов
/ 16 февраля 2011

Пытаюсь понять, как работает ftplib.

Я пытаюсь сохранить файл на FTP-сервер и реализовать обратный вызов.

В документации написано:

FTP.storbinary(command, file[, blocksize, callback, rest])

callback функция определена как в документации:

Функция обратного вызова вызывается для каждого полученного блока данных, с одним строковым аргументом, дающим блок данных.

Как реализовать этот обратный вызов?Пример обратного вызова на retrbinary (чтение файла) может выглядеть следующим образом:

def handle(block):
    f.write(block)
    print ".", 

, который покажет ход загрузки файла, f - объект файла.

Но я не знаю, как реализовать это с storbinary.

Любые предложения о том, как это можно сделать?Я знаю о параметре block, но как мне настроить его при загрузке?

ОБНОВЛЕНИЕ:

У меня есть обратный вызов для загрузки как:

def handle(block):
    f.read(block)
    print ".",

Но, как и ожидалось, выдает ошибку:

an integer is required

Передача int(block) также не работает.

1 Ответ

5 голосов
/ 16 февраля 2011

Если ваш обратный вызов

def handle(block):
    f.write(block)
    print ".", 

Python имеет функции первого класса, которые могут быть переданы как params - это точка обратного вызова - вы передаете функцию как param для вызова storbinary-

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

Из документа Python,

обратный вызов - это необязательный параметр с одним параметром, который вызывается для каждого блока данных после его отправки.

Это чисто метод пост-обработки, например, показывает состояние передачи, вызывается после отправки каждого блока данных. Выше он вызывается после отправки каждых 1024 байтов данных.

Для реализации статуса передачи, что-то вроде этого -

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

os.path.getsize даст вам общий размер в байтах вашего файла.

...