Overwriting/clearing 上一个控制台行
Overwriting/clearing previous console line
我的问题是,我希望能够在 python 控制台中 overwrite/clear 之前打印的行。这个问题已经被问过很多次(例如Python - Remove and Replace Printed items),但是使用的是完全相同的代码
(标记为正确的答案,对我来说什么也没有打印出来):
for i in range(10):
print("Loading" + "." * i)
time.sleep(1)
sys.stdout.write("3[F") # Cursor up one line
sys.stdout.write("3[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
有什么想法吗?我在谷歌上搜索了很多,没有任何效果。它要么什么都不打印,要么就是不覆盖。
如果有帮助,我是 运行 windows 8.1 和 Python 3.51。 运行 通过 cmd 的代码不影响任何东西。
此外,添加 sys.stdout.flush()
也没有帮助。
您需要运行您的程序从命令行运行,而不是从 IDLE 中运行。
那么,这应该有效:
import sys
import time
for i in range(10):
sys.stdout.write("\r" + "Loading" + "." * i)
time.sleep(1)
sys.stdout.flush()
print()
\r
转到行首。所以你必须确保你的字符串
print 至少和之前的一样长。否则,您将看到之前打印的部分内容。
您正在尝试使用 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)
(来源:)
否则如果你只想渲染,你可以做,
import sys
import time
# point by point
msg = "Loading"
print(msg, end="")
for _ in range(10):
print(end=".")
sys.stdout.flush()
time.sleep(1)
print()
# Or all char by char
i = 10
msg = "Loading" + "." * i
for char in msg:
print(end=char)
sys.stdout.flush()
time.sleep(1)
print()
希望能帮到你。谢谢
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")
我找不到更优雅的解决方案来清理最后的线路。如果有人知道,请与我分享。
我的问题是,我希望能够在 python 控制台中 overwrite/clear 之前打印的行。这个问题已经被问过很多次(例如Python - Remove and Replace Printed items),但是使用的是完全相同的代码 (标记为正确的答案,对我来说什么也没有打印出来):
for i in range(10):
print("Loading" + "." * i)
time.sleep(1)
sys.stdout.write("3[F") # Cursor up one line
sys.stdout.write("3[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
有什么想法吗?我在谷歌上搜索了很多,没有任何效果。它要么什么都不打印,要么就是不覆盖。
如果有帮助,我是 运行 windows 8.1 和 Python 3.51。 运行 通过 cmd 的代码不影响任何东西。
此外,添加 sys.stdout.flush()
也没有帮助。
您需要运行您的程序从命令行运行,而不是从 IDLE 中运行。
那么,这应该有效:
import sys
import time
for i in range(10):
sys.stdout.write("\r" + "Loading" + "." * i)
time.sleep(1)
sys.stdout.flush()
print()
\r
转到行首。所以你必须确保你的字符串
print 至少和之前的一样长。否则,您将看到之前打印的部分内容。
您正在尝试使用 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)
(来源:
否则如果你只想渲染,你可以做,
import sys
import time
# point by point
msg = "Loading"
print(msg, end="")
for _ in range(10):
print(end=".")
sys.stdout.flush()
time.sleep(1)
print()
# Or all char by char
i = 10
msg = "Loading" + "." * i
for char in msg:
print(end=char)
sys.stdout.flush()
time.sleep(1)
print()
希望能帮到你。谢谢
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")
我找不到更优雅的解决方案来清理最后的线路。如果有人知道,请与我分享。