Python 3,如何使用print清除行以进行覆盖?

4

我想覆盖我的最后一行打印输出并换行,但我无法清除上一行。

我以为flush可以清除该行,但我看不到其有任何效果。

import time

s = "qwertyuiopåasdfghjklæøzxccvbnm"

for num in range(len(s)):
    print("\r{}".format(str[:len(s)-num]), end="", flush=True)
    time.sleep(.1)

在我的例子中,最终输出的结果如下:

qwertyuiopåasdfghjklæøzxccvbnm

希望输出只有“q”。如果下一个打印内容比第一行小,我仍然能看到上一行的结尾。

我可以用空格覆盖第一行,但我不喜欢这样做,因为如果我调整控制台大小,它会使所有内容移动。

是否有任何方法真正清除最后一行,仅清除最后一行?

在linux和windows中都能工作的解决方案将是很好的。

谢谢。


请查看此处的答案:https://dev59.com/pm445IYBdhLWcg3wXZIy - Ahmed Ghazey
2个回答

2
您可以使用format来添加空格以填充字符串,这将覆盖旧文本。
import time
s = "qwertyuiopåasdfghjklæøzxccvbnm"

spacer = '\r{{:{}}}'.format(len(s)) # '\r{:30}' for this s

for num in range(len(s), 0, -1):
    print(spacer.format(s[:num]), end='')
    time.sleep(.1)

print()

您可以在此处阅读有关格式规范迷你语言的更多信息:这里

为什么不直接使用' ' * (len(s) - num)呢? - Dan
@Dan 我猜你可以这样做 print(s[:num] + ' ' * (len(s) - num))。我认为这并没有更好。如果 '{{:{}}}'.format(len(s)) 让人困惑,我想你可以这样做 '{:' + str(len(s)) + '}' - Patrick Haugh
你的代码在循环结尾没有以“q”结束,这是因为使用了end="\r"。不过我理解你的意思了。我仍会使用我的代码,并加上ns = s[:len(s) - num]print("\r{:{}}".format(ns, len(ns)+1), end="", flush=True) - supremebot

0
一个更可重用的解决方案可能是:
from os import get_terminal_size

def rprint(*args, **kwargs):
    try:
        cols, rows = get_terminal_size()
    except OSError:
        # If get_terminal_size is not supported, override with whitespaces is not needed.
        cols, rows = (1, 1)

    # Override the line with whitespace and return cursor(-1 because of cursor size)
    print("\r{:>{}}".format("", cols-1), end="\r")
    print(*args, **{**kwargs, **{"end": "", "flush": True}})


if __name__ == '__main__':
    import time

    s = "qwertyuiopåasdfghjklæøzxccvbnmq"

    # I want to end the loop with "q", not an empty string.
    for num in range(len(s)):
        rprint(s[:len(s) - num])
        time.sleep(.1)

    rprint("Override last line again")

仅在Python 3.5+中进行了测试。

但是,如果最后一行打印的内容超过终端宽度,则会失败。

我不知道是否有办法将最后一行打印到标准输出?如果可以,则可以计算该行的长度,而不是使用get_terminal_size。


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