5

我有一个控制台脚本,它使用ftplib作为后端从 ftp 服务器获取许多文件。我想使用tqdm给用户一些反馈,前提是他们打开了“详细”开关。这必须是可选的,因为某些用户可能会在没有tty访问权限的情况下使用该脚本。

ftplib的方法需要一个回调,retrbinary因此应该可以以某种方式将tqdm 挂在那里。但是,我不知道这个回调会是什么样子。

4

3 回答 3

4

来自FTP.retrbinary

为接收到的每个数据块调用回调函数,并使用单个字符串参数给出数据块。

所以回调可能是这样的:

with open(filename, 'wb') as fd:
    total = ftpclient.size(filename)

    with tqdm(total=total) as pbar:
        def callback_(data):
            l = len(data)
            pbar.update(l)
            fd.write(data)

        ftpclient.retrbinary('RETR {}'.format(filename), callback_)

当心:此代码未经测试,可能必须进行调整。

于 2016-02-29T14:36:51.233 回答
2

该代码不应工作,因为pbar当块终止时将“关闭” with,这发生在ftpclient.retrbinary(...). 你需要一个非常小的缩进模式:

with open(filename, 'wb') as fd:
    total = ftpclient.size(filename)

    with tqdm(total=total,
              unit='B', unit_scale=True, unit_divisor=1024, 
              disable=not verbose) as pbar:
        def cb(data):
            pbar.update(len(data))
            fd.write(data)

        ftpclient.retrbinary('RETR {}'.format(filename), cb)

编辑添加disable标志和字节缩放

于 2016-07-23T14:59:25.410 回答
1
with open(filename, 'wb') as fd:
    total = ftpclient.size(filename)

    with tqdm(total=total,
              unit='B', unit_scale=True, unit_divisor=1024, 
              disable=not verbose) as pbar:
        def cb(data):
            pbar.update(len(data))
            fd.write(data)

        ftpclient.retrbinary('RETR {}'.format(filename), cb)
于 2020-08-30T15:24:31.857 回答