Python ftplib: показать прогресс загрузки FTP

я загружаю большой файл с FTP с помощью Python 3.4.

Я хотел бы иметь возможность показывать процент прогресса при загрузке файла. Вот мой код:

from ftplib import FTP
import os.path

# Init
sizeWritten = 0
totalSize = os.path.getsize('test.zip')
print('Total file size : ' + str(round(totalSize / 1024 / 1024 ,1)) + ' Mb')

# Define a handle to print the percentage uploaded
def handle(block):
    sizeWritten += 1024 # this line fail because sizeWritten is not initialized.
    percentComplete = sizeWritten / totalSize
    print(str(percentComplete) + " percent complete")

# Open FTP connection
ftp = FTP('website.com')
ftp.login('user','password')

# Open the file and upload it
file = open('test.zip', 'rb')
ftp.storbinary('STOR test.zip', file, 1024, handle)

# Close the connection and the file
ftp.quit()
file.close()

как иметь количество блоков, уже прочитанных в функции дескриптора?

обновление

после прочтения ответа cmd я добавил Это в свой код:

class FtpUploadTracker:
    sizeWritten = 0
    totalSize = 0
    lastShownPercent = 0

    def __init__(self, totalSize):
        self.totalSize = totalSize

    def handle(self, block):
        self.sizeWritten += 1024
        percentComplete = round((self.sizeWritten / self.totalSize) * 100)

        if (self.lastShownPercent != percentComplete):
            self.lastShownPercent = percentComplete
            print(str(percentComplete) + " percent complete")

и я называю FTP-загрузку так:

uploadTracker = FtpUploadTracker(int(totalSize))
ftp.storbinary('STOR test.zip', file, 1024, uploadTracker.handle)

1 ответов


есть три не-хакерских способа, которые я могу придумать. Все это затем сдвигает "ownwership" переменной:

  1. передайте значение и верните результат (в основном это означает, что он хранится в вызывающем абоненте)
  2. значение должно быть глобальным и инициализировать его до 0 и в верхней части файла. (читайте на global ключевое слово)
  3. имейте эту функцию как функцию-член класса для обработки отслеживания загрузки. Тогда сделайте sizeWritten экземпляр переменной класс.