Python的ftpib与tqdm

时间:2016-02-29 14:28:02

标签: python ftplib tqdm

我有一个控制台脚本,它使用ftplib作为后端从ftp服务器获取大量文件。我想使用tqdm给用户一些反馈,只要他们有一个"详细的"打开。此必须是可选的,因为某些用户可能会使用没有tty访问权限的脚本。

ftplib' retrbinary方法接受回调,因此应该可以以某种方式将tqdm挂钩。但是,我不知道这个回调会是什么样子。

3 个答案:

答案 0 :(得分:2)

来自FTP.retrbinary

  

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

所以回调可能是这样的:

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

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

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

注意:此代码未经测试,可能需要进行调整。

答案 1 :(得分: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标记和字节缩放

答案 2 :(得分:0)

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)