Python 3 多行打印更新

Mat*_*Cox 3 python

是否可以打印和更新多于一行?这适用于一行:

print ("Orders: " + str(OrderCount) + " Operations: " + str(OperationCount), end="\r")
Run Code Online (Sandbox Code Playgroud)

并得到这个:(当然数字更新,因为它在一个循环中)

Orders: 25 Operations: 300
Run Code Online (Sandbox Code Playgroud)

我试过这个:

print ("Orders: " + str(OrderCount) + "\rOperations: " + str(OperationCount), end="\r\r")
Run Code Online (Sandbox Code Playgroud)

并得到这个:(数字确实更新正确)

Operations: 300
Run Code Online (Sandbox Code Playgroud)

寻找两行更新如下:

Orders: 25
Operations: 300
Run Code Online (Sandbox Code Playgroud)

并不是:

Orders: 23
Operations: 298

Orders: 24
Operations: 299

Orders: 25
Operations: 300
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 11

\r是一个回车,光标移动到行首(第 0 列)。从那里开始,编写更多的文本将覆盖之前编写的内容,因此您最终只会看到最后一行(这足以覆盖您之前编写的所有内容)。

你想要\n一个换行符,它移动到下一行(并再次从第 0 列开始):

print("Orders: " + str(OrderCount) + "\nOperations: " + str(OperationCount), end="\n\n")
Run Code Online (Sandbox Code Playgroud)

考虑使用字符串模板而不是使用str()+连接str.format()

print("Orders: {}\nOperations: {}\n".format(OrderCount, OperationCount))
Run Code Online (Sandbox Code Playgroud)

格式化的字符串文字

print(f"Orders: {OrderCount}\nOperations: {OperationCount}\n")
Run Code Online (Sandbox Code Playgroud)

如果你想使用\r回车更新两行,你可以使用ANSI控制代码;打印\x1B[2A( ESC [ 2 A ) 将光标向上移动 2 次,根据需要调整数字。这是否有效取决于您支持的平台

在我的 Mac 上,以下演示工作并使用随机数更新两行;我使用 ESC [ 0 K 来确保行上的任何剩余字符都被删除:

print("Orders: " + str(OrderCount) + "\nOperations: " + str(OperationCount), end="\n\n")
Run Code Online (Sandbox Code Playgroud)

演示:

演示 2 行多次更新的 GIF 动画

您还可以使用Curses切换到全终端控制或坚持将所有内容放在一行上。如果您打算走 Curses 路线,请考虑到 Windows 兼容性充其量只是粗略的。