在python中使用回车和换行的正确方法



问题

在我用python编写代码的两年里,我一直在努力解决这个问题,因此我想寻求正确的方法。如何使其覆盖上一次打印,同时具有换行符(通过return或\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:

使用rn的正常(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.writern

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

回车不会撤消整个打印或任何操作,它只是将光标返回到当前行的第一列。想象一下打字机上的支架返回左侧。如果回车前有换行符,则光标将位于刚刚打印的换行符下方的换行符的左侧。

要做你想做的事情,并覆盖之前的行,你必须做一些事情,比如重新打印整个屏幕的行,或者使用诅咒之类的东西来为你做这件事。

加上alefir的答案,我能想到的最接近的是这样的东西,它把你想改变的一切都放在一行上。不确定它是否满足您的代码需求。

import time
counter1 = 0
counter2 = 0
counter3 = 0
print("%st%st%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("%.1ftt%.1ftt%.1f" % (counter1, counter2, counter3), end = "r")

或者,要用多行实现alefir的方法,可以使用这样的东西来清除屏幕:

# 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}
""")    

最新更新