如何覆盖 Python 中的一行

How do I overwrite a line in Python

我创建了一个简单的 python 程序,最多可以数到 10

我想要实现的是让程序删除以前的号码并打印新号码

这是我创建的代码:

import sys
import time
for i in range(10):
    text = "\r" + str(i)
    sys.stdout.write(text)
    sys.stdout.flush()
    time.sleep(1)

输出:

0123456789

将代码更改为在 str(i) 之后添加 "\r" 也不起作用

import sys
import time
for i in range(10):
    text = str(i) + "\r"
    sys.stdout.write(text)
    sys.stdout.flush()
    time.sleep(1)

这也导致:

0123456789

我一直在寻找它来计算,最后只显示 9 但是它不会覆盖以前的数字

编辑:

我正在使用 Windows、Python3

编辑 2:

How to overwrite the previous print to stdout in python? 没有给我一个有效的答案,它仍然没有达到我想要的效果

因此,由于我的出色推理,它不是重复的 :P

作为替代方案,您可以使用 os.system("cls")

清除整个 window

我会这样做:

for x in range(10):
    print("{}".format(x), end="\r")

为什么不使用python的标准打印呢?虽然在许多调试器屏幕中给出了这往往不起作用。在终端(ubuntu)它确实

import time

for i in range (10):
    print(i, end='\r')
    time.sleep(1)

可能对于 stdout 也存在一些东西,但在这种情况下我通常使用 python3

的打印

虚拟终端接受了一些控制符号。其中之一是 '\b',它将一个转车符移回一个位置。这个也被 Windows 接受,我将在下面的示例中使用它。 Unix 终端接受更多控件,包括颜色更改等。



from time import sleep
import sys, os

def clear ():
    os.system("cls" if sys.platform.startswith("win") else "clear")

clear()

s = "1"
sys.stdout.write(s)
for x in range(2, 21):
    sleep(1)
    # Return carret to beginning of line:
    l = len(s)
    s = l*"\b"
    sys.stdout.write(s)
    # Clear line (just in case):
    s = l*" "
    sys.stdout.write(s)
    # Return to the beginning again:
    s = l*"\b"
    sys.stdout.write(s)
    # Write over new text:
    s = str(x)
    sys.stdout.write(s)

我相信您的代码应该可以完美运行。问题应该是您使用的是 Windows 终端。尝试使用 Linux。大多数代码在 Windows 中不起作用。您可以参考此 link 了解为什么您必须在 Windows.

上停止使用 python

这也是您可以尝试的替代代码。

    import time
    for i in range(10):
        text = str(i)
        print(text,end = "\r")
        time.sleep(1)

使用end参数指定"\r"作为行尾。

import time
for i in range(10):
    print(i, end="\r")
    time.sleep(1)