在python中使用回车return和换行的正确方法
Correct method of using a carriage return and newlines in python
问题
在 python 编码的两年里,我在某个地方和某个地方都在为这个问题而苦苦挣扎,因此我想寻求正确的方法。你如何让它覆盖以前的打印,同时有换行符 (通过 returns 或 \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:
最后使用回车return(\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
回车 return 不会撤消整个打印或任何内容,它只是 return 将光标移动到当前行的第一列。想一想打字机上的托架 return 向左移动。如果你在回车前有一个换行符return,那么光标将刚好在你刚刚打印的那一行的左边。
要执行您想要执行的操作并覆盖之前的行,您必须执行某些操作,例如重新打印整个屏幕的行,或者使用诸如 curses 之类的工具来为您执行此操作。
添加到 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}
""")
问题
在 python 编码的两年里,我在某个地方和某个地方都在为这个问题而苦苦挣扎,因此我想寻求正确的方法。你如何让它覆盖以前的打印,同时有换行符 (通过 returns 或 \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
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
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:
最后使用回车return(\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
回车 return 不会撤消整个打印或任何内容,它只是 return 将光标移动到当前行的第一列。想一想打字机上的托架 return 向左移动。如果你在回车前有一个换行符return,那么光标将刚好在你刚刚打印的那一行的左边。
要执行您想要执行的操作并覆盖之前的行,您必须执行某些操作,例如重新打印整个屏幕的行,或者使用诸如 curses 之类的工具来为您执行此操作。
添加到 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}
""")