打印到相同的行,而不是在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)