在Python中显示FTP下载进度(ProgressBar) [英] Show FTP download progress in Python (ProgressBar)
问题描述
我正在使用以下Python脚本通过FTP下载文件。我想要的是在下载时查看进度的详细信息。为此,我使用了 ProgressBar
,但未显示任何内容。
I am downloading files over FTP using the following Python script. What I wanted is to see the details of the progress while downloading. For that I used ProgressBar
but it isn't showing anything.
这是我的代码:
import re
import os
import ftplib
import ntpath
import sys
import time
from progressbar import AnimatedMarker, Bar, BouncingBar, Counter, ETA, \
AdaptiveETA, FileTransferSpeed, FormatLabel, Percentage, \
ProgressBar, ReverseBar, RotatingMarker, \
SimpleProgress, Timer, UnknownLength
ftp = ftplib.FTP("Your IP address")
ftp.login("Username", "password")
files = []
try:
ftp.cwd("/feed_1")
files = ftp.nlst()
for fname in files:
res = re.findall("2018-07-25", fname)
if res:
print 'Opening local file ' + ntpath.basename(fname)
file = open(ntpath.basename(fname), 'wb')
print 'Getting ' + ntpath.basename(fname)
try:
widgets = ['Downloading: ', Percentage(), ' ',
Bar(marker='#',left='[',right=']'),
' ', ETA(), ' ', FileTransferSpeed()]
pbar = ProgressBar(widgets=widgets, maxval=500)
pbar.start()
ftp.retrbinary('RETR ' + ntpath.basename(fname), file.write)
except:
pass
print 'Closing file ' + ntpath.basename(fname)
file.close()
print (fname)
time.sleep(0.2)
pbar.update()
pbar.finish()
if not res:
continue
except ftplib.error_perm , resp:
if str(resp) == "550 No files found":
print "No files in this directory"
pass
else:
raise
请帮助了解这里到底出了什么问题。谢谢:)
Please help in understanding what's actually wrong here. Thanks :)
推荐答案
您永远不会更新 ProgressBar
。您需要做的是:
You never update the ProgressBar
. What you need to do is to:
-
实现要传递给
FTP.retrbinary
作为回调
,而不是file.write
。该函数应该执行file.write
并更新进度条。
Implement a function (or a class method) that you will pass to
FTP.retrbinary
ascallback
instead offile.write
. The function should dofile.write
and also update the progress bar.
您还需要知道 ProgressBar
的 maxval
参数的文件/传输的大小。为此,您可以使用 FTP.size
。
You also need to know size of the file/transfer for maxval
argument of ProgressBar
. For that you can use FTP.size
.
一个简单的实现方式是:
A trivial implementation is like:
local_path = "archive.zip"
remote_path = "/remote/path/archive.zip"
file = open(local_path, 'wb')
size = ftp.size(remote_path)
pbar = ProgressBar(widgets=widgets, maxval=size)
pbar.start()
def file_write(data):
file.write(data)
global pbar
pbar += len(data)
ftp.retrbinary("RETR " + remote_path, file_write)
现在您想要的进度条:
Downloading: 72% [############################### ] ETA: 0:00:00 242.1 MiB/s
其他注意事项:OP代码使用 progressbar2
库。
PyQt实现:从另一个运行FTP下载的线程更新PyQt进度。
这篇关于在Python中显示FTP下载进度(ProgressBar)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!