我有一个控制台脚本,它使用ftplib作为后端从ftp服务器获取大量文件。我想使用tqdm给用户一些反馈,只要他们有一个"详细的"打开。此必须是可选的,因为某些用户可能会使用没有tty
访问权限的脚本。
ftplib' retrbinary
方法接受回调,因此应该可以以某种方式将tqdm挂钩。但是,我不知道这个回调会是什么样子。
答案 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)