Python FTP 下载的进度条不工作
Python progressbar for FTP downloads not working
我正在尝试使用进度条显示 FTP 文件下载进度 (ftplib),但进度没有正确更新。速度开始很高然后逐渐降低(降低到字节)。几秒钟后下载完成,而进度条仍为 0%。看来我没有正确更新进度,我不确定如何更正。
我尝试使用 pbar += len(data)
在 Show FTP download progress in Python (ProgressBar) 找到的解决方案,但这给了我以下错误:
Traceback (most recent call last): ] ETA: --:--:-- 0.00 B/s
File "ftp.py", line 38, in <module>
ftp.retrbinary('RETR ' + file, file_write)
File "/usr/lib/python3.5/ftplib.py", line 446, in retrbinary
callback(data)
File "ftp.py", line 29, in file_write
pbar += len(data)
TypeError: unsupported operand type(s) for +=: 'ProgressBar' and 'int'
所以我通过将 pbar.update(len(data))
添加到我的 file_write()
函数来调整它并让它正常工作,但正如我所说的速度完全不正确,一直在下降(直到它可能达到 0 ) 然后突然完成。
这是我的整个脚本:
from ftplib import FTP_TLS
import time
from progressbar import AnimatedMarker, Bar, BouncingBar, Counter, ETA, \
AdaptiveETA, FileTransferSpeed, FormatLabel, Percentage, \
ProgressBar, ReverseBar, RotatingMarker, \
SimpleProgress, Timer, UnknownLength
ftp_host = 'domain.com'
ftp_port = 21
ftp_user = 'user'
ftp_pass = 'pass'
ftp = FTP_TLS()
ftp.connect(ftp_host, ftp_port)
ftp.login(ftp_user, ftp_pass)
ftp.cwd('/videos')
files = ftp.nlst()
widgets = ['Downloading: ', Percentage(), ' ', Bar(marker='#', \
left='[',right=']'), ' ', ETA(), ' ', FileTransferSpeed()]
def file_write(data):
localfile.write(data)
global pbar
pbar.update(len(data))
#pbar += len(data)
for file in files:
size = ftp.size(file)
pbar = ProgressBar(widgets = widgets, maxval = size)
pbar.start()
localfile = open('/local/videos/' + file, 'wb')
ftp.retrbinary('RETR ' + file, file_write)
pbar.finish()
localfile.close()
ftp.quit()
如能提供任何帮助以使此代码正常工作,我们将不胜感激。
更新:
我做了以下 additions/changes 并获得了正确的 speed/progress 条形移动:
i = 0
def file_write(data):
localfile.write(data)
global pbar, i
pbar.update(i * 1024 * 10)
i+=1
#pbar += len(data)
但就在它即将完成时,我得到了这个错误:
Traceback (most recent call last):################################################## ] ETA: 0:00:00 45.62 MB/s
File "ftp.py", line 42, in <module>
ftp.retrbinary('RETR ' + file, file_write)
File "/usr/lib/python3.5/ftplib.py", line 446, in retrbinary
callback(data)
File "ftp.py", line 30, in file_write
pbar.update(o * 1024 * 10)
File "/usr/local/lib/python3.5/dist-packages/progressbar/progressbar.py", line 250, in update
raise ValueError('Value out of range')
ValueError: Value out of range
我正在使用进度条 2.5(最新)和 Python 3.5。
代码实际上是 progressbar2
library.
其 ProgressBar
class 实现 __iadd__
。
我正在尝试使用进度条显示 FTP 文件下载进度 (ftplib),但进度没有正确更新。速度开始很高然后逐渐降低(降低到字节)。几秒钟后下载完成,而进度条仍为 0%。看来我没有正确更新进度,我不确定如何更正。
我尝试使用 pbar += len(data)
在 Show FTP download progress in Python (ProgressBar) 找到的解决方案,但这给了我以下错误:
Traceback (most recent call last): ] ETA: --:--:-- 0.00 B/s
File "ftp.py", line 38, in <module>
ftp.retrbinary('RETR ' + file, file_write)
File "/usr/lib/python3.5/ftplib.py", line 446, in retrbinary
callback(data)
File "ftp.py", line 29, in file_write
pbar += len(data)
TypeError: unsupported operand type(s) for +=: 'ProgressBar' and 'int'
所以我通过将 pbar.update(len(data))
添加到我的 file_write()
函数来调整它并让它正常工作,但正如我所说的速度完全不正确,一直在下降(直到它可能达到 0 ) 然后突然完成。
这是我的整个脚本:
from ftplib import FTP_TLS
import time
from progressbar import AnimatedMarker, Bar, BouncingBar, Counter, ETA, \
AdaptiveETA, FileTransferSpeed, FormatLabel, Percentage, \
ProgressBar, ReverseBar, RotatingMarker, \
SimpleProgress, Timer, UnknownLength
ftp_host = 'domain.com'
ftp_port = 21
ftp_user = 'user'
ftp_pass = 'pass'
ftp = FTP_TLS()
ftp.connect(ftp_host, ftp_port)
ftp.login(ftp_user, ftp_pass)
ftp.cwd('/videos')
files = ftp.nlst()
widgets = ['Downloading: ', Percentage(), ' ', Bar(marker='#', \
left='[',right=']'), ' ', ETA(), ' ', FileTransferSpeed()]
def file_write(data):
localfile.write(data)
global pbar
pbar.update(len(data))
#pbar += len(data)
for file in files:
size = ftp.size(file)
pbar = ProgressBar(widgets = widgets, maxval = size)
pbar.start()
localfile = open('/local/videos/' + file, 'wb')
ftp.retrbinary('RETR ' + file, file_write)
pbar.finish()
localfile.close()
ftp.quit()
如能提供任何帮助以使此代码正常工作,我们将不胜感激。
更新:
我做了以下 additions/changes 并获得了正确的 speed/progress 条形移动:
i = 0
def file_write(data):
localfile.write(data)
global pbar, i
pbar.update(i * 1024 * 10)
i+=1
#pbar += len(data)
但就在它即将完成时,我得到了这个错误:
Traceback (most recent call last):################################################## ] ETA: 0:00:00 45.62 MB/s
File "ftp.py", line 42, in <module>
ftp.retrbinary('RETR ' + file, file_write)
File "/usr/lib/python3.5/ftplib.py", line 446, in retrbinary
callback(data)
File "ftp.py", line 30, in file_write
pbar.update(o * 1024 * 10)
File "/usr/local/lib/python3.5/dist-packages/progressbar/progressbar.py", line 250, in update
raise ValueError('Value out of range')
ValueError: Value out of range
我正在使用进度条 2.5(最新)和 Python 3.5。
代码实际上是 progressbar2
library.
其 ProgressBar
class 实现 __iadd__
。