最近在写批量上传文件的脚本,用的库是paramiko,以后将写下paramiko的使用心得, 这次记录下python有关进度条的东西,
众所周知上传,下载,如果有一个进度显示的话, 对使用者也不是枯燥的等待, 起码.. 起码知道脚本在正常工作, 也知道下载/上传 的进度了.
正好这次脚本也有上传的部分.就将这次的心得记录下
首先,所谓的进度条和print没啥不不同,都是将结果输出而已, 但是如果用print就注定
悲剧, 因为print的时候会带一个\n
,可以想象如果我们的进度条还换行,
那还算条子嘛.. 恶汗..
一个最简单的进度条 实现原理就是 再输出完毕后,把光标移动到行首,继续在那里输 出更长的进度条即可实现,新的更长的进度条把旧的短覆盖,就形成了动画效果
我们可以利用\r
, 转义符\r
就可以把光标移动到行首而不换行,转义符\n
就把光
标移动到行首并且换行。 这里用一个例子来说明,这是我脚本中的一个函数,
用于接收paramiko.sftp_client.sftp
中的put方法的callback数据,by the way,
利用paramiko的sftp的put方法,可以将本地文件上传至服务器,默认参数中有一个callback=None,
别人可以利用callback来接收文件上传的进度, 每隔32768字节返回一次进度,我们可以构造一个callback来接收,
def _callback(self,a,b): sys.stdout.write('Data Transmission %10d [%3.2f%%]\r' %(a,a*100./int(b))) sys.stdout.flush()
这样在使用put方法的时候 就可以put(本地文件,远程路径,_callback)
在默认情况下put方法是不需要后面的callback参数的, 只需要本地路径和远程路径, 因为我们需要知道上传进度. 因此加一个callback上去,在callback函数定一个 进度
sys.stdout.write('Data Transmission %10d [%3.2f%%]\r' %(a,a*100./int(b)))
这样当使用put方法的时候. 就可以得到一个文件上传的进度的百分比. 类似这样
Data Transmission 234524 [55%]
同时234524 [55%] 不断变化 直至100%
python丰富的模块,提供了无限可能,这里还有一个好东西叫做progressbar
直接上效果图,ps:我自己没这种需求,就用了最简单的实现模式,这个是我找相关进度条资料的时候顺带找到的
0 顶
0 踩
联系客服