我有一个控制台脚本,它使用ftplib作为后端从 ftp 服务器获取许多文件。我想使用tqdm给用户一些反馈,前提是他们打开了“详细”开关。这必须是可选的,因为某些用户可能会在没有tty
访问权限的情况下使用该脚本。
ftplib的方法需要一个回调,retrbinary
因此应该可以以某种方式将tqdm 挂在那里。但是,我不知道这个回调会是什么样子。
来自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_)
当心:此代码未经测试,可能必须进行调整。
该代码不应工作,因为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
标志和字节缩放
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)