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()
Как узнать количество блоков, уже прочитанных в функции handle?
Обновить
Прочитав ответ 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 ответ
Решение
Есть три нехакерских способа, о которых я могу думать. Все затем сдвигают "собственный" переменной:
- передать значение и вернуть результат (в основном это означает, что оно хранится в вызывающей программе)
- иметь значение быть глобальным, и инициализировать его 0 и в верхней части вашего файла. (читать на
global
ключевое слово) - иметь эту функцию в качестве функции-члена класса для обработки отслеживания загрузки. Тогда сделай
sizeWritten
переменная экземпляра этого класса.