假设我有以下代码:
for x in range(10):
print(x)
我想获取输出结果
1
2
etc..
我想要做的是,不打印换行符,而是在同一行上用新值替换先前的值。
假设我有以下代码:
for x in range(10):
print(x)
我想获取输出结果
1
2
etc..
我想要做的是,不打印换行符,而是在同一行上用新值替换先前的值。
一种方法是使用回车符 ('\r'
) 字符返回到行的开头,而不会前进到下一行。
for x in range(10):
print(x, end='\r')
print()
from __future__ import print_function
for x in range(10):
print(x, end='\r')
print()
for x in range(10):
print '{}\r'.format(x),
print
for x in range(10):
print '{0}\r'.format(x),
print
'\x1b[1K'
('\x1b'
=ESC)即可。for x in range(75):
print('*' * (75 - x), x, end='\x1b[1K\r')
print()
%
运算符已不推荐使用。基本上,现在所有字符串都有一个format方法。 在这种情况下,{0}
表示“format()
的第一个参数”(计数从0开始)。 - Mike DeSimonere.sub(r'\$<\d+>[/*]?', '', curses.tigetstr('el') or '')
命令来获取用户所在终端的正确清除该行剩余部分的字符串。请记得使用类似 curses.setupterm(fd=sys.stdout.fileno())
的命令初始化 curses
,并使用 sys.stdout.isatty()
判断输出是否被重定向到文件中。查看 http://code.activestate.com/recipes/475116/ 获取包含光标控制和颜色支持的完整 Python 模块。 - Mike DeSimoneimport curses; curses.setupterm(fd=sys.stdout.fileno()); print(hex(curses.tigetstr('cr')));
它应该打印字符序列的十六进制代码,以便回到行的开头。 - Mike DeSimoneend='\r'
不也可以吗? - Tim Seguine因为我是通过Google来到这里的,但我正在使用Python 3,所以这是如何在Python 3中工作的:
for x in range(10):
print("Progress {:2.1%}".format(x / 10), end="\r")
print("\r", message, end="")
。 - william_grisaitisprint("Progress {:2.1%} ".format(x), end="\r")
因此,当 x 的长度从 3 位数变为 2 位数时,尾随的空格将擦除多余的数字。 - Ben L@Mike DeSimone的回答大部分时间都是有效的。但是...
for x in ['abc', 1]:
print '{}\r'.format(x),
-> 1bc
这是因为 '\r'
只会回到一行的开头,但不会清除输出内容。
如果您只需要 POSIX 支持,以下方法可以清除当前行并将光标保留在其开头:
print '\x1b[2K\r',
它使用ANSI转义码来清除终端行。可以在维基百科和这个优秀的演讲中找到更多信息。
我发现的另一种(可以说更糟糕)解决方案如下:
last_x = ''
for x in ['abc', 1]:
print ' ' * len(str(last_x)) + '\r',
print '{}\r'.format(x),
last_x = x
-> 1
其中一个优点是它也可以在Windows上运行。
在查看此线程之前,我也有同样的疑问。对我而言,只有在正确刷新缓冲区后,sys.stdout.write才有效。
for x in range(10):
sys.stdout.write('\r'+str(x))
sys.stdout.flush()
没有刷新,结果仅在脚本结束时输出。
stringvar.ljust(10,' ')
这样用空格填充字符串的其余部分也是一个好主意。 - Annarfych压制换行并打印 \r
。
print 1,
print '\r2'
或者将其写入标准输出:
sys.stdout.write('1')
sys.stdout.write('\r2')
def print_statusline(msg: str):
last_msg_length = len(getattr(print_statusline, 'last_msg', ''))
print(' ' * last_msg_length, end='\r')
print(msg, end='\r')
sys.stdout.flush() # Some say they needed this, I didn't.
setattr(print_statusline, 'last_msg', msg)
只需按照以下方式使用:
for msg in ["Initializing...", "Initialization successful!"]:
print_statusline(msg)
time.sleep(1)
for i in range(9, 0, -1):
print_statusline("{}".format(i) * i)
time.sleep(0.5)
for x in range(10):
time.sleep(0.5) # shows how its working
print("\r {}".format(x), end="")
time.sleep(0.5) 是为了展示先前输出被擦除并打印新输出时使用的。 "\r"当它在打印消息的开头时,它将在新输出之前擦除先前的输出。
试试这个:
import time
while True:
print("Hi ", end="\r")
time.sleep(1)
print("Bob", end="\r")
time.sleep(1)
对我而言它是有效的。 end="\r"
这个部分会使它覆盖在先前的一行上。
警告!
如果您打印hi
,然后使用\r
打印hello
,您将得到hillo
,因为输出写在了前两个字母之上。如果您用空格打印hi
(这里不显示),那么它将输出hi
。要解决这个问题,请使用\r
打印出空格。
Hi BobHi BobHi BobHi BobHi Bob
。Python 3.7.1 - PaulMag\r
在开头而不是结尾。 - PaulMag这适用于Windows和Python 3.6。
import time
for x in range(10):
time.sleep(0.5)
print(str(x)+'\r',end='')
我尝试了这个页面上的所有解决方案都无法用于IPython,但是对@Mike-Desimone的解决方案做了一点微调就可以了:不要以回车符结束行,而是以回车符开头:
for x in range(10):
print '\r{0}'.format(x),