【问题标题】:Python 3 Print Update on multiple linesPython 3 多行打印更新
【发布时间】:2016-09-12 16:42:38
【问题描述】:

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

print ("Orders: " + str(OrderCount) + " Operations: " + str(OperationCount), end="\r")

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

Orders: 25 Operations: 300

我试过这个:

print ("Orders: " + str(OrderCount) + "\rOperations: " + str(OperationCount), end="\r\r")

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

Operations: 300

寻找两行更新如下:

Orders: 25
Operations: 300

而不是:

Orders: 23
Operations: 298

Orders: 24
Operations: 299

Orders: 25
Operations: 300

【问题讨论】:

    标签: python


    【解决方案1】:

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

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

    print("Orders: " + str(OrderCount) + "\nOperations: " + str(OperationCount), end="\n\n")
    

    与其使用str()+ 连接,不如考虑使用带有str.format() 的字符串模板:

    print("Orders: {}\nOperations: {}\n".format(OrderCount, OperationCount))
    

    formatted string literal:

    print(f"Orders: {OrderCount}\nOperations: {OperationCount}\n")
    

    如果你想使用\r回车更新两行,你可以使用ANSI control codes;打印\x1B[2A (ESC [ 2 A) 将光标向上移动2次,根据需要调整数字。这是否有效取决于what platform you are supporting

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

    import random, time
    
    orders = 0
    operations = 0
    
    UP = "\x1B[3A"
    CLR = "\x1B[0K"
    print("\n\n")  # set up blank lines so cursor moves work
    while True:
       orders += random.randrange(1, 3)
       operations += random.randrange(2, 10)
    
       print(f"{UP}Orders: {orders}{CLR}\nOperations: {operations}{CLR}\n")
    
       time.sleep(random.uniform(0.5, 2))
    

    演示:

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

    【讨论】:

    • 这两种解决方案都不更新控制台:我得到:订单:88 操作:197 订单:88 操作:198 当然比这更多的行
    • @MatthewCox:查看您的评论来源,我看到了换行符。那你还不清楚;请更新您的问题以解释您预期的输出。
    • 好的,谢谢!!当!你快!! (你必须给我超过 30 秒的时间来更新我自己的编辑!!):)
    • 如果我想添加第三行然后与其他行更新它的值怎么办。我应该如何更改代码以使其正常工作。
    • @ParasGupta:试着想一想;如果您必须使用光标键手动执行此操作,则需要向上 4 次,而不是 3 次。因此调整UP ANSI 代码以将3 替换为4。或者,正如我的回答所说:根据需要调整数字
    【解决方案2】:

    您可能想要\n 而不是\r\r 是“回车”,也就是“回到行首”——所以你在“订单”上打印“操作”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多