提问者:小点点

覆盖/清除以前的控制台行


我的问题是,我希望能够覆盖/清除python控制台中以前打印的行。这个问题已经被问了很多次(例如Python-删除和替换打印项),但是使用的代码与此完全相同(答案标记为正确,对我来说根本不打印任何内容):

for i in range(10):
    print("Loading" + "." * i)
    time.sleep(1)
    sys.stdout.write("\033[F") # Cursor up one line
    sys.stdout.write("\033[K") # Clear to the end of line

我得到输出(在python IDLE中):

Loading
[F[KLoading.
[F[KLoading..
[F[KLoading...
[F[KLoading....
[F[KLoading.....
[F[KLoading......
[F[KLoading.......
[F[KLoading........
[F[KLoading.........
[F[KLoading..........
[F[K

有什么想法吗?我在谷歌上搜索了很多,没有什么是真正有效的。它要么不打印,要么就是不覆盖。

如果这有帮助的话,我正在运行Windows8.1和Python3.51。通过cmd运行代码不会影响任何事情。

此外,添加sys.stdout.flush()也没有帮助。


共3个答案

匿名用户

您需要在命令行中运行程序,而不是在IDLE中运行。

那么,这应该行得通:

import sys
import time

for i in range(10):
    sys.stdout.write("\r" + "Loading" + "." * i)
    time.sleep(1)
    sys.stdout.flush()
print()

\r转到该行的开头。所以你必须确保你打印的字符串至少和之前的一样长。否则,您将看到先前打印的部分内容。

匿名用户

您正在尝试使用ANSI转义序列来移动光标。默认情况下,Windows不支持这些。要启用它们,您可以在终端中使用pip install colorama安装colorama模块,然后在Python中:

import colorama
colorama.init()

如果已升级到Windows 10,则可以使用以下选项启用支持:

import ctypes
kernel32 = ctypes.windll.kernel32
kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7)

(资料来源:https://stackoverflow.com/a/36760881/6379747)

匿名用户

python 3.4的更新答案

虽然print函数有行结束字符和行刷新关键字参数,但您可以使用这种方法。

text = str()
for i in range(10):
    text = "Loading{}".format("." * i)
    print(text, end="\r", flush=True)
print(" " * len(text), end="\r")

我找不到更优雅的解决方案来清洗最后的生产线。如果有人知道,请与我分享。