打印到相同的行,而不是在Python中的新行
基本上我想和这个人做的相反…嘿嘿。
Python脚本:每次打印新行到shell而不是更新现有行
我有一个程序,告诉我有多远。
for i in some_list: #do a bunch of stuff. print i/len(some_list)*100," percent complete"
所以如果len(some_list)是50,那么我会把最后一行打印50次。 我想打印一行,并不断更新该行。 我知道我知道这可能是你整天读的最蹩脚的问题。 我只是无法弄清楚我需要放进谷歌的四个词来得到答案。
更新! 我尝试了这个build议,这是正确的。 新的代码
print percent_complete," \r",
完成百分比只是一个string(我是第一次抽象,现在我试图成为文字)。 现在的结果是它运行程序,不打印任何东西,直到程序结束后,然后打印“100%完成”在一条,只有一行。
没有回车(但用逗号,半数的build议),它不打印任何东西,直到最后。 然后打印:
0 percent complete 2 percent complete 3 percent complete 4 percent complete
等等。 所以现在新的问题是用逗号直到程序结束才打印。
随着回车,没有逗号它performance完全相同,都没有。
它被称为回车,或\r
使用
print i/len(some_list)*100," percent complete \r",
逗号防止打印添加换行符。 (并且空间将保持从前面的输出清楚的线)
此外,不要忘记终止print ""
至less得到一个最终的换行符!
从python 3.x你可以做:
print('bla bla', end='')
(也可以在Python 2.6或2.7中使用,方法是将from __future__ import print_function
在脚本/模块的顶部)
Python控制台进度条示例:
import time # status generator def range_with_status(total): """ iterate from 0 to total and show progress in console """ n=0 while n<total: done = '#'*(n+1) todo = '-'*(total-n-1) s = '<{0}>'.format(done+todo) if not todo: s+='\n' if n>0: s = '\r'+s print(s, end='') yield n n+=1 # example for use of status generator for i in range_with_status(10): time.sleep(0.1)
对于控制台你可能需要
sys.stdout.flush()
强制更新。 我认为使用,
打印将阻止刷新标准输出,不知何故它不会更新
对我来说,Remi和siriusd的答案是一个组合:
from __future__ import print_function import sys print(str, end='\r') sys.stdout.flush()
这对我有用,砍了一次,看看是否有可能,但从未在我的程序中实际使用过(GUI非常好):
import time f = '%4i %%' len_to_clear = len(f)+1 clear = '\x08'* len_to_clear print 'Progress in percent:'+' '*(len_to_clear), for i in range(123): print clear+f % (i*100//123), time.sleep(0.4) raw_input('\nDone')
试试像这样:
for i in some_list: #do a bunch of stuff. print i/len(some_list)*100," percent complete",
(用逗号结尾)
import time import sys def update_pct(w_str): w_str = str(w_str) sys.stdout.write("\b" * len(w_str)) sys.stdout.write(" " * len(w_str)) sys.stdout.write("\b" * len(w_str)) sys.stdout.write(w_str) sys.stdout.flush() for pct in range(0, 101): update_pct("{n}%".format(n=str(pct))) time.sleep(0.1)
\b
会将光标的位置移回一个空格
所以我们把它一直移动到行首
然后写空格来清除当前行 – 当我们写空格时,光标向前/向右移动一个
所以我们必须把光标移回到行首,然后再写新的数据
使用Python 2.7在Windows cmd上进行testing
基于Python 2.7+
Remi的答案使用这个:
from __future__ import print_function import time # status generator def range_with_status(total): """ iterate from 0 to total and show progress in console """ import sys n = 0 while n < total: done = '#' * (n + 1) todo = '-' * (total - n - 1) s = '<{0}>'.format(done + todo) if not todo: s += '\n' if n > 0: s = '\r' + s print(s, end='\r') sys.stdout.flush() yield n n += 1 # example for use of status generator for i in range_with_status(50): time.sleep(0.2)