【问题标题】:Correct method of using a carriage return and newlines in python在python中使用回车和换行符的正确方法
【发布时间】:2021-12-11 07:14:44
【问题描述】:

问题

在我用 python 编码的两年中,我在某个地方和某个地方遇到了这个问题,因此我想寻求正确的方法。你如何让它覆盖以前的打印,同时有换行符(通过返回或\n)。我已经尝试了我能找到的大多数答案,但它只完成了我想要的一项工作。


测试模型

import time, sys

counter1 = 0
counter2 = 0
counter3 = 0

for i in range(5):
    time.sleep(0.1)
    counter1 += 1
    counter2 += 1
    counter3 += 1
    
    #print method here!

尝试 1:

使用 """\r 的多行 (f) 字符串

    print(f"""\r
Counter 1: {counter1}
Counter 2: {counter2}
Counter 3: {counter3}
    """)

尝试 1 的输出:

Counter 1: 1
Counter 2: 1
Counter 3: 1


Counter 1: 2
Counter 2: 2
Counter 3: 2

..etc

尝试 2:

使用\r\n 的普通(f)字符串

print(f"\rCounter 1: {counter1}\nCounter 2: {counter2}\nCounter 3: {counter3}")

尝试 2 的输出:

Counter 1: 1
Counter 2: 1
Counter 3: 1
Counter 1: 2
Counter 2: 2
Counter 3: 2
etc..

尝试 3:

使用sys.stdout.write\r\n

sys.stdout.write(f'\rCounter 1: {counter1}\nCounter 2: {counter2}\nCounter 3: {counter3}')
sys.stdout.flush()  

尝试 3 的输出:

Counter 1: 1
Counter 2: 1
Counter 1: 2
Counter 2: 2
Counter 1: 3
etc..

尝试 4:

在末尾使用回车(\r):

print(f"Counter 1: {counter1}\nCounter 2: {counter2}\nCounter 3: {counter3}\n", end = "\r")

尝试 4 的输出:

Counter 1: 1
Counter 2: 1
Counter 3: 1
Counter 1: 2
Counter 2: 2
Counter 3: 2

尝试 5:

彼此分开打印,第一个前面有\r

print(f"\rCounter 1: {counter1}")
print(f"Counter 2: {counter2}")
print(f"Counter 3: {counter3}")

尝试 5 的输出:

Counter 1: 1
Counter 2: 1
Counter 3: 1
Counter 1: 2
Counter 2: 2
Counter 3: 2

【问题讨论】:

    标签: python python-3.x newline carriage-return


    【解决方案1】:

    回车不会撤消整个打印或任何操作,它只是将光标返回到当前行的第一列。想想打字机上的马车回到左侧。如果您在回车之前有一个换行符,那么光标将位于您刚刚打印的行的左侧。

    要执行您想要执行的操作并覆盖之前的行,您必须执行诸如重新打印整个屏幕的行之类的操作,或者使用诸如 curses 之类的东西来为您完成。

    【讨论】:

      【解决方案2】:

      除了 alefir 的答案之外,我能想到的最接近的是这样的东西,它将您想要更改的所有内容放在一行上。不确定它是否满足您的代码需求。

      import time
      
      counter1 = 0
      counter2 = 0
      counter3 = 0
      
      print("%s\t%s\t%s" % ("Counter 1 name", "Counter 2 name", "Counter 3 name"))
      for i in range(5):
          time.sleep(0.1)
          counter1 += 1
          counter2 += 1
          counter3 += 1
          print("%.1f\t\t%.1f\t\t%.1f" % (counter1, counter2, counter3), end = "\r")
      

      或者,要使用多行实现 alefir 的方法,您可以使用 like this to clear the screen

      # import only system from os
      from os import system, name
      
      # define our clear function
      def clear():
        
          # for windows
          if name == 'nt':
              _ = system('cls')
        
          # for mac and linux(here, os.name is 'posix')
          else:
              _ = system('clear')
      

      结合你的尝试 1,你会得到这样的结果:

      for i in range(5):
          time.sleep(0.1)
          counter1 += 1
          counter2 += 1
          counter3 += 1
          clear()
          print(f"""\r
          Counter 1: {counter1}
          Counter 2: {counter2}
          Counter 3: {counter3}
          """)    
      

      【讨论】:

        猜你喜欢
        • 2020-09-09
        • 2017-06-28
        • 1970-01-01
        • 1970-01-01
        • 2013-06-12
        • 2013-02-23
        • 2012-06-17
        • 1970-01-01
        • 2023-03-18
        相关资源
        最近更新 更多