7

我正在使用 python 3.3.2 和 pysftp 制作一个备份实用程序,将文件副本存储在我网络上的另一台计算机上。

我已经知道如何使用 pysftp 传输这些文件,但是我想查看传输的进度(每秒字节数、完成百分比、剩余时间),而不是一些指示传输已经开始或完成的静态打印语句

可能是这样的(文件名:3.4MiB/s | 40%<#########=============> | 0:03:54 剩余)

编辑:如果我只知道如何获取 pysftp 的 put 命令来输出信息,我可能会建立一个进度条,这就是我想知道的

编辑:我想我在广泛挖掘后找到了另一个问题的答案:

如何使用 paramiko 查看(日志)文件传输进度?

4

4 回答 4

11

两种get/put方法都存在回调函数(见官方文档

get(remotepath, localpath=None, callback=None, preserve_mtime=False)

回调可能如下所示:

lambda x,y: print("{} transfered out of {}".format(x,y))
于 2016-11-11T10:39:26.250 回答
8

您可以创建一个函数,每隔 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))
于 2018-10-29T10:17:25.417 回答
3
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
于 2020-10-19T09:09:01.747 回答
-3

您可以编写自己的进度条,如果您对终端有所了解,这相当简单。或者你可以使用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()

在这两种情况下,您都需要文件传输方法在传输过程中产生一些东西。如果你能让它产生它接收到的字节,那么无论哪种方式都可以很容易地创建一个进度条。

于 2014-06-18T06:16:00.300 回答