基本上我想做与这个人做的相反的事情......呵呵。
Python Script: Print new line each time to shell rather than update existing line
我有一个程序告诉我它有多远。
for i in some_list:
#do a bunch of stuff.
print i/len(some_list)*100," percent complete"
因此,如果len(some_list)为50,我会将最后一行打印50次。我想打印一行并不断更新该行。我知道我知道这可能是你整天都会读到的最蹩脚的问题。我只是无法弄清楚我需要将四个字放入谷歌以获得答案。
更新!我试过mvds的建议哪个看起来正确。新代码
print percent_complete," \r",
完成百分比只是一个字符串(我现在第一次抽象,我试图成为文字)。现在的结果是它运行程序,直到程序结束后才打印ANYTHING,然后在一行且只有一行打印“100%完成”。
如果没有回车符(但是使用逗号,mvds的一半建议),它会一直打印到最后。然后打印:
0 percent complete 2 percent complete 3 percent complete 4 percent complete
等等。所以现在新的问题是用逗号在程序完成之前它不会打印。
使用回车并且没有逗号,它的行为与两者都没有完全相同。
答案 0 :(得分:73)
它被称为回车,或\r
使用
print i/len(some_list)*100," percent complete \r",
逗号可防止打印添加换行符。 (并且空格将使线条与先前的输出保持清晰)
另外,不要忘记以print ""
结束,以获得至少一个最终换行符!
答案 1 :(得分:27)
从python 3.x你可以做到:
print('bla bla', end='')
(通过将from __future__ import print_function
放在脚本/模块的顶部,也可以在Python 2.6或2.7中使用)
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)
答案 2 :(得分:17)
对我而言,有效的是Remi&s和siriusd的答案的组合:
from __future__ import print_function
import sys
print(str, end='\r')
sys.stdout.flush()
答案 3 :(得分:12)
对于您可能需要的控制台
sys.stdout.flush()
强制更新。我认为在打印中使用,
将阻止stdout进行刷新,并以某种方式不会更新
答案 4 :(得分:3)
没有人提到在Python 3.3+中您不需要sys.stdout.flush()
。 print('foobar', end='', flush=True)
有效。
答案 5 :(得分:2)
这对我有用,黑客一次,看看是否可能,但从未在我的程序中实际使用过(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')
答案 6 :(得分:2)
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上测试
答案 7 :(得分:1)
试试这样:
for i in some_list:
#do a bunch of stuff.
print i/len(some_list)*100," percent complete",
(最后用逗号。)
答案 8 :(得分:0)
截至 2021 年,对于 Python 3.9.0,以下解决方案适用于 Windows 10 Pycharm。
print('\r some string ', end='', flush=True)
答案 9 :(得分:0)
答案 10 :(得分:0)
对于提供StartRunning(),StopRunning(), boolean getIsRunning()和整数getProgress100()返回 值,范围为0到100,这将提供文本进度条 跑步时...
EditText
答案 11 :(得分:0)
我自己想出了倒数计时的效果,但它也可以按一定比例工作。
import time
#Number of seconds to wait
i=15
#Until seconds has reached zero
while i > -1:
#Ensure string overwrites the previous line by adding spaces at end
print("\r{} seconds left. ".format(i),end='')
time.sleep(1)
i-=1
print("") #Adds newline after it's done
只要'/ r'之后的内容与前一个字符串相同或更长(包括空格),它将在同一行覆盖它。只需确保您包含end ='',否则它将打印到换行符。希望有帮助!
答案 12 :(得分:0)
对于Python 3 +
for i in range(5):
print(str(i) + '\r', sep='', end ='', file = sys.stdout , flush = False)
答案 13 :(得分:0)
如果您使用的是Spyder,则行将与所有先前的解决方案一起连续打印。一种避免这种情况的方法是使用:
for i in range(1000):
print('\r' + str(round(i/len(df)*100,1)) + '% complete', end='')
sys.stdout.flush()
答案 14 :(得分:0)
如果您使用的是Python 3 那么这是给你的,它确实有效。
print(value , sep='',end ='', file = sys.stdout , flush = False)
答案 15 :(得分:0)
晚于游戏-但由于没有一个答案对我有用(我没有全部尝试),因此我在搜索中多次遇到此答案...在python 3中,此解决方案非常优雅,我相信它确实可以满足作者的需求,并且可以在同一行上更新一条语句。请注意,如果行是收缩而不是增长,则可能必须执行一些特殊的操作(例如,使字符串固定长度,并在末尾添加空格)
if __name__ == '__main__':
for i in range(100):
print("", end=f"\rPercentComplete: {i} %")
time.sleep(0.2)
答案 16 :(得分:0)
对于Python 3.6+
和任何list
而不是int
,以及使用控制台窗口的整个宽度而不跨到新行,您可以使用以下:
请注意:请注意,函数get_console_with()
仅在基于Linux的系统上可用,因此必须重写它才能在Windows上使用。
import os
import time
def get_console_width():
"""Returns the width of console.
NOTE: The below implementation works only on Linux-based operating systems.
If you wish to use it on another OS, please make sure to modify it appropriately.
"""
return int(os.popen('stty size', 'r').read().split()[1])
def range_with_progress(list_of_elements):
"""Iterate through list with a progress bar shown in console."""
# Get the total number of elements of the given list.
total = len(list_of_elements)
# Get the width of currently used console. Subtract 2 from the value for the
# edge characters "[" and "]"
max_width = get_console_width() - 2
# Start iterating over the list.
for index, element in enumerate(list_of_elements):
# Compute how many characters should be printed as "done". It is simply
# a percentage of work done multiplied by the width of the console. That
# is: if we're on element 50 out of 100, that means we're 50% done, or
# 0.5, and we should mark half of the entire console as "done".
done = int(index / total * max_width)
# Whatever is left, should be printed as "unfinished"
remaining = max_width - done
# Print to the console.
print(f'[{done * "#"}{remaining * "."}]', end='\r')
# yield the element to work with it
yield element
# Finally, print the full line. If you wish, you can also print whitespace
# so that the progress bar disappears once you are done. In that case do not
# forget to add the "end" parameter to print function.
print(f'[{max_width * "#"}]')
if __name__ == '__main__':
list_of_elements = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
for e in range_with_progress(list_of_elements):
time.sleep(0.2)
答案 17 :(得分:0)
基于Remi answer Python 2.7+
,请使用此代码:
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)