动态一行打印

369 投票
22 回答
725545 浏览
提问于 2025-04-16 01:18

我想要输出几个语句,但希望这些语句之间没有换行。

具体来说,假设我有:

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)

撰写回答