动态一行打印
我想要输出几个语句,但希望这些语句之间没有换行。
具体来说,假设我有:
for item in range(1,100):
print item
结果是:
1
2
3
4
.
.
.
我想知道怎么才能让它看起来像这样:
1 2 3 4 5 ...
更棒的是,能不能把最后一个数字“覆盖”在前一个数字上,这样屏幕上一次只显示一个数字?
22 个回答
56
使用 print item,
可以让打印的内容不换行。
在 Python 3 中,你可以用 print(item, end=" ")
来实现同样的效果。
如果你想让每个数字都显示在同一个位置,比如在 Python 2.7 中,你可以这样做:
to = 20
digits = len(str(to - 1))
delete = "\b" * (digits + 1)
for i in range(to):
print "{0}{1:{2}}".format(delete, i, digits),
在 Python 3 中,这个过程稍微复杂一点;你需要刷新 sys.stdout
,否则在循环结束之前是不会打印任何内容的:
import sys
to = 20
digits = len(str(to - 1))
delete = "\b" * (digits)
for i in range(to):
print("{0}{1:{2}}".format(delete, i, digits), end="")
sys.stdout.flush()
172
顺便问一下……怎么每次刷新它,让它在一个地方打印mi,只需要改变数字。
一般来说,做到这一点的方法是使用终端控制代码。这是一个特别简单的例子,你只需要一个特殊字符:U+000D 回车符,在Python(和很多其他语言)中写作'\r'
。下面是一个基于你代码的完整示例:
from sys import stdout
from time import sleep
for i in range(1,20):
stdout.write("\r%d" % i)
stdout.flush()
sleep(1)
stdout.write("\n") # move the cursor to the next line
关于这个,有几点可能会让你感到惊讶:
\r
放在字符串的开头,这样在程序运行时,光标总是在数字后面。这不仅仅是为了好看:如果你反过来做,有些终端模拟器会搞得很混乱。- 如果你不加最后一行,程序结束后,你的命令行会在数字上面打印提示符。
- 在某些系统上,
stdout.flush
是必要的,否则你可能看不到任何输出。其他系统可能不需要这个,但加上也没坏处。
如果你发现这个方法不管用,首先要怀疑的是你的终端模拟器可能有问题。vttest程序可以帮助你测试。
你可以用print
语句替换stdout.write
,但我更喜欢不把print
和直接使用文件对象混在一起。
555
把 print item
改成:
- 在 Python 2.7 中用
print item,
- 在 Python 3 中用
print(item, end=" ")
如果你想动态打印数据,可以使用以下语法:
- 在 Python 3 中用
print(item, sep=' ', end='', flush=True)