动态打印一行

Pol*_*Pol 283 python printing

我想做几个语句,给出标准输出,而不会在语句之间看到换行符.

具体来说,假设我有:

for item in range(1,100):
    print item
Run Code Online (Sandbox Code Playgroud)

结果是:

1
2
3
4
.
.
.
Run Code Online (Sandbox Code Playgroud)

如何让它看起来像:

1 2 3 4 5 ...
Run Code Online (Sandbox Code Playgroud)

更妙的是,是否可以打印单号最后一个号码,所以只有一个号码在屏幕上在同一时间?

ewa*_*all 452

更改print item到:

  • print item, 在Python 2.7中
  • print(item, end=" ") 在Python 3中

如果要动态打印数据,请使用以下语法:

  • print(item, sep=' ', end='', flush=True) 在Python 3中

  • 仅供参考:print(item,end ="")可以在Python2.7中使用,在文件顶部添加'from __future__ import print_function'. (5认同)
  • 这仅在我将“\r”添加到打印项目的开头后才起作用 (4认同)
  • 但不幸的是,`flush`不能与`from __future__ import print_function`一起使用. (2认同)

zwo*_*wol 147

顺便说一下......如何每次刷新它以便在一个地方打印mi只需更改数字.

通常,这样做的方法是使用终端控制代码.这是一个特别简单的情况,你只需要一个特殊字符:U + 000D CARRIAGE RETURN,用'\r'Python(和许多其他语言)编写.以下是基于您的代码的完整示例:

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
Run Code Online (Sandbox Code Playgroud)

关于这一点的一些事情可能会令人惊讶:

  • \r去的字符串,这样的开始,程序运行时,光标会一直在数字后.这不仅仅是装饰性的:如果你以相反的方式做到这一点,一些终端模拟器会变得非常困惑.
  • 如果您不包括最后一行,那么在程序终止后,您的shell将在该数字的顶部打印其提示.
  • stdout.flush某些系统上是必要的,否则你不会得到任何输出.其他系统可能不需要它,但它不会造成任何伤害.

如果您发现这不起作用,您首先应该怀疑的是您的终端模拟器是错误的.该vttest程序可以帮助你测试.

你可以stdout.write用一个print语句替换它,但我不想print直接使用文件对象.

  • 通常,Python 的文件对象会累积数据,以便它们可以将数据大块地发送到操作系统。这通常是您访问磁盘上文件所需要的,但它会干扰此类任务。`flush()` 强制文件立即将它所拥有的任何内容发送到操作系统。我很惊讶它在没有它的情况下对你有用 - 在我添加它之前它对我不起作用。 (2认同)
  • @user1995839 有一些控制代码可以隐藏光标,但是如果您打算这样做,我强烈建议您使用 `ncurses` 来执行此操作。 (2认同)
  • `sys.stdout.flush()` 似乎对我的 `Freebsd` 和 `Python 2.7` 是强制性的 (2认同)
  • 请注意,回车在 Python REPL 中无法正常工作(至少对我来说,在 Ubuntu 上);你需要执行一个*脚本*,而不仅仅是运行一个 REPL 命令,这样才能工作。 (2认同)

Tim*_*ker 49

使用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),
Run Code Online (Sandbox Code Playgroud)

在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()
Run Code Online (Sandbox Code Playgroud)


Mat*_*hew 16

像其他例子一样,
我使用类似的方法,但不是花时间计算最后的输出长度等,

我只是使用ANSI代码转义返回到行的开头,然后在打印当前状态输出之前清除整行.

import sys

class Printer():
    """Print things to stdout on one line dynamically"""
    def __init__(self,data):
        sys.stdout.write("\r\x1b[K"+data.__str__())
        sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

要在迭代循环中使用,您只需调用以下内容:

x = 1
for f in fileList:
    ProcessFile(f)
    output = "File number %d completed." % x
    Printer(output)
    x += 1   
Run Code Online (Sandbox Code Playgroud)

在这里查看更多


Eli*_*ght 14

您可以在print语句中添加一个尾随逗号,以便在每次迭代中打印空格而不是换行符:

print item,
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用的是Python 2.6或更高版本,则可以使用新的打印功能,这将允许您指定在每个打印项目的末尾都不会有空格(或者允许您指定任何结束想):

from __future__ import print_function
...
print(item, end="")
Run Code Online (Sandbox Code Playgroud)

最后,您可以通过从sys模块导入标准输出直接写入标准输出,该模块返回类似文件的对象:

from sys import stdout
...
stdout.write( str(item) )
Run Code Online (Sandbox Code Playgroud)


Bro*_*oks 11

更改

print item
Run Code Online (Sandbox Code Playgroud)

print "\033[K", item, "\r",
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)
  • "\ 033 [K"清除到行尾
  • \ r \n,返回到行的开头
  • flush语句确保它立即显示,以便您获得实时输出.


Hug*_*ins 8

这么多复杂的答案。如果你有 python 3,只需放在\r打印的开头,然后添加end='', flush=True

import time

for i in range(10):
    print(f'\r{i} foo bar', end='', flush=True)
    time.sleep(0.5)
Run Code Online (Sandbox Code Playgroud)

这将在原地写入0 foo bar, then1 foo bar等。


小智 5

我认为简单的连接应该有效:

nl = []
for x in range(1,10):nl.append(str(x))
print ' '.join(nl)
Run Code Online (Sandbox Code Playgroud)

  • 理解能读得更好,可能更快:`print''.join(str(x)for x in range(1,10))`. (4认同)

cop*_*300 5

我在2.7上使用的另一个答案是打印“。”。每次循环运行(向用户指示事情还在运行)是这样的:

print "\b.",
Run Code Online (Sandbox Code Playgroud)

打印“。” 每个字符之间没有空格。看起来更好一点,并且效果很好。\ b是那些想知道的退格字符。