如何动态刷新多行输出

11

我想动态地刷新一些信息(就像进度条一样),我可以用以下代码来实现

#! /usr/bin/env python
import sys
import time

print "start the output"
def loop():
    i = 0

    while 1:
        i += 1
        output = "\rFirst_line%s..." % str(i) 
        sys.stdout.write(output)        
        sys.stdout.flush()
        time.sleep(1)
loop()

它只能动态输出单行信息,当添加'\n'到输出中时,它不能按预期工作。

output = "\rFirst_line%s...\n" % str(i)

有什么方法可以帮助它刷新多行内容吗?

5个回答

7
我也遇到了这种情况,最终想出了一个解决方法;D

转载-用于Python 2/3的简单模块,可在终端中打印和刷新多行输出内容

您可以将output实例简单地视为普通的dictlist(取决于您使用的模式)。当您修改output实例中的内容时,终端中的输出将自动刷新:D

以下是一个示例:

from reprint import output
import time
import random

print "start the output"

with output(initial_len=3, interval=0) as output_lines:
    while True:
        output_lines[0] = "First_line  {}...".format(random.randint(1,10))
        output_lines[1] = "Second_line {}...".format(random.randint(1,10))
        output_lines[2] = "Third_line  {}...".format(random.randint(1,10))
        time.sleep(0.5)

你可以将列表的内容打印在其中一行上吗?如果我有一个动态变化的值列表,我能将其打印到 output_lines[3] 上吗? - corporateWhore
@corporateWhore 是的,你可以这样做。只需将 output_lines[3] 更改为你想要显示的值,它就会自动刷新在命令行上的显示。 - Yinzo
我可以让它在终端上打印出列表,但我希望列表中的每一行都在自己的终端行上,具体来说是以'\n'分隔。 - corporateWhore
1
@corporateWhore 你应该将列表中的每个元素分配到output_lines的不同索引中,或者你可以直接使用output_lines.change(your_list)将your_list中的所有元素加载到output_lines对象中。 - Yinzo

1

你可以使用curses来完成,但这并不是一件简单的事情。


0

只需这样做:

import time
import random
import sys

while True:
    print(f'''First Line {random.randint(1,10)}
Second Line {random.randint(1,10)}        
Third Line  {random.randint(1,10)}''')
    sys.stdout.write("\x1b[1A"*3) # Cursor up 3 lines
    time.sleep(0.5)

0

没有办法在系统独立的情况下实现这一点(当说“系统”时,不仅指操作系统,还包括终端应用程序及其设置),因为没有标准的转义序列可以移动光标。至于系统相关的方法,可能存在于您的配置中,但需要更多关于您的系统的信息。而且,通常使用此类功能并不是一个好主意。

P.S. 希望您不会将程序的输出重定向到文件。如果重定向到文件,则此类进度指示器会产生可怕的输出。


-1
在控制台中输入 '\b':
import sys
import time

print "start the output"
def loop():
    i = 0
    output = "\rFirst_line%s..." % str(0) 
    sys.stdout.write(output)
    while 1:
        sys.stdout.write('\b'*len(output))
        i += 1
        output = "\rFirst_line%s..." % str(i) 
        sys.stdout.write(output)        
        sys.stdout.flush()
        time.sleep(1)
loop()

嗨,imxylz。感谢您的快速回应,但是如果输出中有'\n',它仍然不能正常工作,例如输出 = "\ rFirst_line%s... \ n +++"%str(i)。 - user1675167
虽然看起来很合理,但您不能使用换行符进行回退(backspace),因为这不兼容之前的电传打字机。如果您想清除屏幕,请查看此链接。https://dev59.com/DU7Sa4cB1Zd3GeqP57rE - imxylz
我尝试了新的函数 print(object1,object2,sep='\n',end=''),接着使用 sys.stdout.write('\b\b\b/b'),但 '\b' 对于带有 '\n' 的字符串仍然无法正常工作。看来我必须改变我的方式(使用 os.system('clear'))。再次感谢。 - user1675167

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接