Python 如何通过PySTFP监控文件传输的进度
我正在使用Python3.3.2和pysftp制作一个备份实用程序,它将文件副本存储在我网络上的另一台计算机上 我已经知道如何使用pysftp传输这些文件,但是我希望看到传输的进度(字节/秒、完成百分比、剩余时间),而不是指示传输已开始或完成的静态打印语句 可能是这样的(文件名:3.4MiB/s | 40%| 0:03:54) 编辑: 如果我知道如何使用pysftp的put命令生成信息,我可能会构建一个进度条,这就是我想知道的 编辑: 我想我在深入挖掘后找到了另一个问题的答案:Python 如何通过PySTFP监控文件传输的进度,python,python-3.x,ssh,sftp,pysftp,Python,Python 3.x,Ssh,Sftp,Pysftp,我正在使用Python3.3.2和pysftp制作一个备份实用程序,它将文件副本存储在我网络上的另一台计算机上 我已经知道如何使用pysftp传输这些文件,但是我希望看到传输的进度(字节/秒、完成百分比、剩余时间),而不是指示传输已开始或完成的静态打印语句 可能是这样的(文件名:3.4MiB/s | 40%| 0:03:54) 编辑: 如果我知道如何使用pysftp的put命令生成信息,我可能会构建一个进度条,这就是我想知道的 编辑: 我想我在深入挖掘后找到了另一个问题的答案: 您可以编写自己的
您可以编写自己的progressbar,如果您对终端有任何了解,这相当简单。或者你可以使用。以下是文档中的一个简单示例:
@example
def example1():
widgets = ['Test: ', Percentage(), ' ', Bar(marker=RotatingMarker()),
' ', ETA(), ' ', FileTransferSpeed()]
pbar = ProgressBar(widgets=widgets, maxval=10000000).start()
for i in range(1000000):
# do something
pbar.update(10*i+1)
pbar.finish()
在这两种情况下,您都需要使用文件传输方法在传输过程中生成一些内容。如果您可以让它产生接收到的字节,那么无论哪种方式创建进度条都非常容易 两种get/put方法中都存在回调函数(请参见 (官方) 其中回调可以类似于:
lambda x,y: print("{} transfered out of {}".format(x,y))
您可以创建一个函数,该函数每10%打印一次传输:
progressDict={}
progressEveryPercent=10
for i in range(0,101):
if i%progressEveryPercent==0:
progressDict[str(i)]=""
def printProgressDecimal(x,y):
if int(100*(int(x)/int(y))) % progressEveryPercent ==0 and progressDict[str(int(100*(int(x)/int(y))))]=="":
print("{}% ({} Transfered(B)/ {} Total File Size(B))".format(str("%.2f" %(100*(int(x)/int(y)))),x,y))
progressDict[str(int(100*(int(x)/int(y))))]="1"
然后可以在get或put命令中调用该函数,如下所示:
sftp.get(eachFile,localpath=localDirectory+eachFile, callback=lambda x,y: printProgressDecimal(x,y))
示例输出为:
0.00% (32768 Transfered(B)/ 1108907068 Total File Size(B))
10.00% (110919680 Transfered(B)/ 1108907068 Total File Size(B))
20.00% (221806592 Transfered(B)/ 1108907068 Total File Size(B))
30.00% (332693504 Transfered(B)/ 1108907068 Total File Size(B))
40.00% (443580416 Transfered(B)/ 1108907068 Total File Size(B))
50.00% (554467328 Transfered(B)/ 1108907068 Total File Size(B))
60.00% (665354240 Transfered(B)/ 1108907068 Total File Size(B))
70.00% (776241152 Transfered(B)/ 1108907068 Total File Size(B))
80.00% (887128064 Transfered(B)/ 1108907068 Total File Size(B))
90.00% (998047744 Transfered(B)/ 1108907068 Total File Size(B))
100.00% (1108907068 Transfered(B)/ 1108907068 Total File Size(B))
没有回答用户的问题:我们如何在pysftp中做到这一点?
0.00% (32768 Transfered(B)/ 1108907068 Total File Size(B))
10.00% (110919680 Transfered(B)/ 1108907068 Total File Size(B))
20.00% (221806592 Transfered(B)/ 1108907068 Total File Size(B))
30.00% (332693504 Transfered(B)/ 1108907068 Total File Size(B))
40.00% (443580416 Transfered(B)/ 1108907068 Total File Size(B))
50.00% (554467328 Transfered(B)/ 1108907068 Total File Size(B))
60.00% (665354240 Transfered(B)/ 1108907068 Total File Size(B))
70.00% (776241152 Transfered(B)/ 1108907068 Total File Size(B))
80.00% (887128064 Transfered(B)/ 1108907068 Total File Size(B))
90.00% (998047744 Transfered(B)/ 1108907068 Total File Size(B))
100.00% (1108907068 Transfered(B)/ 1108907068 Total File Size(B))
import math, pysftp
with pysftp.Connection(host, username, password) as sftp:
sftp.get(remotepath, localpath, callback=lambda x,y: progressbar(x,y))
def progressbar(x, y):
''' progressbar for the pysftp
'''
bar_len = 60
filled_len = math.ceil(bar_len * x / float(y))
percents = math.ceil(100.0 * x / float(y))
bar = '=' * filled_len + '-' * (bar_len - filled_len)
filesize = f'{math.ceil(y/1024):,} KB' if y > 1024 else f'{y} byte'
sys.stdout.write(f'[{bar}] {percents}% {filesize}\r')
sys.stdout.flush()
[============================================================] 100% 4,342 KB