这里是引用
https://m.baidu.com/ala/c/s/mip.oomake.com/question/1342293
引用:
https://m.baidu.com/ala/c/s/mip.oomake.com/question/1342293
如何在python中覆盖以前的打印到stdout?
如果我有以下代码:
```python
for x in range(10):
print x
我会得到的输出
1
2
etc..
我想要做的不是打印新行,而是要替换先前的值,并用同一行上的新值覆盖它。
```python
```python
import sys
import time
for i in range(10):
sys.stdout.write("\r" + i)
sys.stdout.flush()
time.sleep(1)
nsequi 2018-11-04我无法让这个页面上的任何解决方案适用于IPython,但是@ Mike-Desimone的解决方案稍有不同就完成了这项工作:不是使用回车符终止该行,而是使用回车符开始行:
```python
for x in range(10):
print '\r{0}'.format(x),
此外,此方法不需要第二个打印语句。iid 2018-11-04由于我最终通过Google访问,但我使用的是Python 3,以下是Python 3的工作方式:
for x in range(10):
print("Progress {:2.1%}".format(x / 10), end="\r")相关答案:How can I suppress the newline after a print statement?hquia 2018-11-04在访问此主题之前我有同样的问题。对我来说,
sys.stdout.write仅在我正确刷新缓冲区时工作,即for x in range(10):
sys.stdout.write('\r'+str(x))
sys.stdout.flush()
如果不刷新,结果仅在脚本结束时打印oautem 2018-11-04答案可能大部分时间都有效。但…
for x in ['abc', 1]:
print '{}\r'.format(x),-> 1bc
这是因为'\r'仅返回到行的开头但不清除输出。编辑:更好的解决方案(比我下面的旧提议) 如果POSIX支持对您来说足够了,以下将清除当前行并将光标留在其开头:
print '\x1b[2K\r',
它使用ANSI转义码来清除终端线。更多信息可以在in wikipedia和this great talk找到。旧答案 我找到的(不太好)的解决方案看起来像这样:
last_x = ''for x in ['abc', 1]:
print ' ' * len(str(last_x)) + '\r',
print '{}\r'.format(x), last_x = x-> 1
一个优点是它也适用于Windows。quo_et 2018-11-04取消换行并打印\r。print 1,print '\r2'或者写信给
stdout:sys.stdout.write('1')
sys.stdout.write('\r2')
mut 2018-11-04我使用以下方法创建了一个加载器:
for i in range(10):
print(i*'.', end='\r')
nomnis 2018-11-04一种方法是使用回车符('\r')字符返回到行的开头而不前进到下一行:for x in range(10): print '{0}\r'.format(x),printprint语句末尾的逗号告诉它不要转到下一行。最后一个打印语句前进到下一行,因此您的提示不会覆盖最终输出。qquasi 2018-11-04一个更清洁,更“即插即用”的版本@ Nagasaki45的回答:
def print_statusline(msg: str):
last_msg_length = len(print_statusline.last_msg)
if hasattr(print_statusline, 'last_msg')
else 0
print(' ' * last_msg_length, end='\r')
print(msg, end='\r')
sys.stdout.flush()
# Some say they needed this, I didn't.
print_statusline.last_msg = msg
# Then simply use like this:for msg in ["Initializing...", "Initialization successful!"]:
print_statusline(msg)
time.sleep(1)
# If you want to check that the line gets cleared properly:
for i in range(9, 0, -1):
print_statusline("{}".format(i) * i)
time.sleep(0.5)
与其他许多答案不同,它可以使用不同长度的字符串正常工作,因为它会清空带有空格的行。也适用于Windows。qet 2018-11-04尝试这个:
import time
while True:
print("Hi ", end="\r")
time.sleep(1)
print("Bob", end="\r")
time.sleep(1)
它对我有用。 end="\r"部分正在覆盖前一行。 实质性的东西(你不必阅读): 这种类型的行返回称为回车符,它将光标移动到行的开头。当你按Enter键时,它的作用是创建一个新行,然后将光标移动到新行,然后将其移动到开头(如果还没有)。这源于打字机,无论何时将马车(顶部的条形物)一直向左推,而不是沿着一条线。这会覆盖该行上的内容,但是较旧的打字机只是将它放在上一个字母的顶部,所以它看起来很糟糕。你今天可以购买的打字机在写完之前会删除任何东西。 我知道这是一个编写代码的地方,但我无法抗拒给一点历史课。 如果我有任何错误,请在下面的评论中告诉我。xsit 2018-11-0
for x in range(10):
time.sleep(0.5)
# shows how its working
print("\r i".format(i)), end="")
time.sleep(0.5)
表示如何擦除先前的输出并打印新输出 “\ r”当它在打印消息开始时,它会在新输出之前删除先前的输出。zomnis 2018-11-04