打印到同一行,而不是python中的新行

时间:2010-08-05 23:36:20

标签: python stdout

基本上我想做与这个人做的相反的事情......呵呵。

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    

等等。所以现在新的问题是用逗号在程序完成之前它不会打印。

使用回车并且没有逗号,它的行为与两者都没有完全相同。

18 个答案:

答案 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)

截至2020年底,Linux控制台上的Python 3.8.5仅对我有效:

print('some string', end='\r')

贷方转到:This post

答案 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)