如何在同一行上打印多个内容,一次打印一个?

How can I print multiple things on the same line, one at a time?

提问人:user697108 提问时间:4/9/2011 最后编辑:Karl Knechteluser697108 更新时间:1/3/2023 访问量:618609

问:

我想运行一个脚本,它基本上显示如下输出:

Installing XXX...               [DONE]

目前,我先打印,然后打印。Installing XXX...[DONE]

我怎样才能在同一行上打印?Installing xxx...[DONE]


对于在同一行上写入新消息,替换之前存在的内容的具体问题,请参阅如何将以前的打印覆盖到 stdout?。这里的大多数答案将这个问题解释为关于在当前行的末尾编写新文本。

有关使用单打印一次输出多个内容的问题,请参阅如何在同一行上一次打印多个内容(固定文本和/或变量值)?

python 打印 stdout 换行

评论

2赞 Cees Timmerman 12/9/2016
如何防止 Python 打印添加换行符或空格的可能副本?
1赞 ideasman42 7/23/2017
这个问题的答案没有提到有时你想清除界限,请参阅:stackoverflow.com/questions/45263205

答:

42赞 ferostar 4/9/2011 #1

使用 和 。这样,如果要重新创建打印功能,则必须手动添加新行。我认为可能没有必要为此使用诅咒。sys.stdout.write('Installing XXX... ')sys.stdout.write('Done')"\n"

评论

4赞 mgilson 1/31/2013
我个人更喜欢这个解决方案而不是投票较高的解决方案,因为它在 python2.x 和 python3.x 上的工作方式完全相同,而不需要依赖导入或类似的东西。__future__
14赞 John Giotta 4/9/2011 #2

sys.stdout.write无需回程回车即可打印

import sys
sys.stdout.write("installing xxx")
sys.stdout.write(".")

http://en.wikibooks.org/wiki/Python_Programming/Input_and_output#printing_without_commas_or_newlines

331赞 multipleinterfaces 4/9/2011 #3

Python 3 解决方案

该函数接受默认为 (new line) 的参数。将其设置为空字符串可防止它在行的末尾发出新行。print()end\n

def install_xxx():
    print("Installing XXX...      ", end="", flush=True)

install_xxx()
print("[DONE]")

Python 2 解决方案

在行尾放置逗号可防止发出新行(您应该注意,输出末尾会有一个额外的空格)。print()print()

def install_xxx():
   print "Installing XXX...      ",

install_xxx()
print "[DONE]"

评论

2赞 Prometheus 1/8/2015
它工作得很好。到目前为止,我只看到了 stdout 解决方案。很高兴知道这一点。
5赞 Paddre 2/20/2015
如果您同时具有打印和耗时的操作(都在同一功能/缩进级别中),则此操作不起作用。在操作开始之前,根本没有输出,完成后,输出将显示为整体
2赞 multipleinterfaces 2/21/2015
这可能更像是操作系统为整个进程预设的输出缓冲的功能,这不是特定于 python 的问题。有关特定于 python 的解决方法,请参阅 stackoverflow.com/questions/107705
17赞 Martijn Pieters 11/3/2016
如果没有换行符,您可能希望显式刷新缓冲区。在 Python 3 中使用,在 Python 2 中添加调用。print("...", end="", flush=True)sys.stdout.flush()
12赞 John 1/7/2018
在 Python 3.x 中,您需要在末尾添加一个“\r”来替换附加到其末尾的打印行 VSprint("Progress: {}%".format(var), end="\r", flush=True)
110赞 magnump0 3/14/2013 #4

您可以简单地使用这个:

print 'something',
...
print ' else',

输出将是

something else

无需矫枉过正。注意末尾的逗号。import sys

Python 3+ 删除末尾的换行符插入。阅读更多print("some string", end="");help(print);

评论

3赞 ethanjyx 11/12/2013
请注意,使用此方法有两个空格
1赞 gixxer 5/22/2015
这是最简单、最有效的答案。
0赞 Mayank Jaiswal 11/27/2015
当 print 参数在括号中时,这不起作用。这有效:<打印“hello”,;print(“hello”)>但这不起作用 <print(“hello”,);print(“你好”)>
0赞 drglove 2/7/2016
@MayankJaiswal 这确实适用于 parens。print('你好'),
1赞 magnump0 2/7/2016
print函数在 python 2 和 3 中的语法略有不同。
18赞 Nick 7/23/2013 #5

没有一个答案对我有用,因为它们都暂停了,直到遇到一条新线。我写了一个简单的助手:

def print_no_newline(string):
    import sys
    sys.stdout.write(string)
    sys.stdout.flush()

要对其进行测试,请执行以下操作:

import time
print_no_newline('hello ')
# Simulate a long task
time.sleep(2)
print('world')

“hello”会先打印出来,在睡觉前刷到屏幕上。之后,您可以使用标准打印。

评论

2赞 Obi-Wan 10/20/2016
谢谢!正是我需要的,又名.flush()
66赞 Vadim Zin4uk 3/31/2014 #6

您应该使用退格键 '\r' 或 ('\x08') char 返回控制台输出中的上一个位置

蟒蛇 2+:

import time
import sys

def backspace(n):
    sys.stdout.write((b'\x08' * n).decode()) # use \x08 char to go back   

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(s)                     # just print
    sys.stdout.flush()                      # needed for flush when using \x08
    backspace(len(s))                       # back n chars    
    time.sleep(0.2)                         # sleep for 200ms

Python 3:

import time   

def backline():        
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print(s, end='')                        # just print and flush
    backline()                              # back to the beginning of line    
    time.sleep(0.2)                         # sleep for 200ms

此代码将在一行上从 0% 计数到 100%。最终值为:

> python test.py
100%

在这种情况下,有关flush的其他信息如下:为什么包含“end=”参数的python print语句在while循环中的行为不同?

评论

1赞 Turtles Are Cute 3/10/2015
澄清一下,此示例中注释掉的代码似乎适用于 Python 2,而未注释的行适用于 Python 3。
1赞 Vadim Zin4uk 3/10/2015
bouth 行在 Python 3 中可以正常工作。如果使用 '\x08' 作为退格键,则需要刷新输出流 - print((b'\x08' * n).decode(), end='', flush=True)
1赞 bjnortier 5/8/2017
回车符 '\r' 返回到行的开头,因此不需要 '* n'
9赞 TulkinRB 2/28/2015 #7

打印有一个可选的参数,它是最终打印的内容。 默认值为换行符,但您可以将其更改为空字符串。例如:endprint("hello world!", end="")

评论

2赞 arjoonn 9/6/2015
这是在 python 3 中。在 python 2 中,您可以简单地.末尾的逗号可防止添加换行符。print 'something',
4赞 Brian Bunker 10/10/2015 #8

如果要覆盖上一行(而不是不断添加),可以在 print 语句的末尾组合 with。例如\rprint(),

from time import sleep

for i in xrange(0, 10):
    print("\r{0}".format(i)),
    sleep(.5)

print("...DONE!")

将计数为 0 到 9,替换控制台中的旧数字。将与最后一个计数器 9 在同一行上打印。"...DONE!"

对于 OP,这将允许控制台将安装完成百分比显示为“进度条”,您可以在其中定义开始和结束字符位置,并更新两者之间的标记。

print("Installing |XXXXXX              | 30%"),
1赞 k20392 10/17/2016 #9

以防万一您已将值预先存储在数组中,您可以按以下格式调用它们:

for i in range(0,n):
       print arr[i],
-3赞 Luis Silva 12/7/2016 #10

我找到了这个解决方案,它正在 Python 2.7 上运行

# Working on Python 2.7 Linux

import time
import sys


def backspace(n):
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(string)
    backspace(len(s))                       # back for n chars
    sys.stdout.flush()
    time.sleep(0.2)                         # sleep for 200ms

评论

1赞 Cory Madden 8/7/2017
这是 Python 2.7 的不正确语法,即使使用正确的语法,代码也无法正常工作。print
2赞 Chris Cosby 10/26/2017 #11

这是一个非常古老的线程,但这里有一个非常详尽的答案和示例代码。

\r是 ASCII 字符集中的 Carriage Return 的字符串表示形式。它与八进制 [] 或十六进制 [] 或十进制 [] 相同。看一个无聊的读物。它()是一个非常便携的表示形式,很容易让人们阅读。它非常简单地意味着将打字机上的托架一直移动到起点,而无需推进纸张。这是表示回车和换行的部分。015chr(0o15)0dchr(0x0d)13chr(13)man ascii\rCRCRLF

print()是 Python 3 中的一个函数。在 Python 2(您有兴趣使用的任何版本)中,可以通过从模块导入函数的定义来强制函数。该函数的好处是,您可以指定在末尾打印的内容,从而覆盖在每次调用结束时打印换行符的默认行为。print__future__print\nprint()

sys.stdout.flush告诉 Python 刷新标准输出的输出,除非您另有指定,否则您发送输出的位置。您还可以通过运行 with 或 设置环境变量 来获得相同的行为,从而跳过 和 调用。通过这样做获得的金额几乎正好为零,如果您方便地忘记了在应用程序正常运行之前必须执行该步骤,则调试起来并不容易。print()python -uPYTHONUNBUFFERED=1import syssys.stdout.flush()

还有一个样本。请注意,这在 Python 2 或 3 中完美运行。

from __future__ import print_function

import sys
import time

ANS = 42
FACTORS = {n for n in range(1, ANS + 1) if ANS % n == 0}

for i in range(1, ANS + 1):
    if i in FACTORS:
        print('\r{0:d}'.format(i), end='')
        sys.stdout.flush()
        time.sleep(ANS / 100.0)
else:
    print()

评论

0赞 Marc Cayuela 10/26/2017
我认为你的答案更适合:stackoverflow.com/questions/45263205/......
4赞 Dannid 1/11/2018 #12

这里有一个 2.7 兼容版本,源自 @Vadim-Zin4uk 的 3.0 版本:

Python 2 中文文档

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print '{0}\r'.format(s),                # just print and flush

    time.sleep(0.2)

就此而言,提供的 3.0 解决方案看起来有点臃肿。例如,退格法不使用整数参数,并且可能完全取消。

Python 3 (英语)

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print('{0}\r'.format(s), end='')        # just print and flush

    time.sleep(0.2)                         # sleep for 200ms

两者都已经过测试并有效。

9赞 Umali Leonard 5/15/2018 #13

这个简单的示例将在同一行上打印 1-10。

for i in range(1,11):
    print (i, end=" ")
30赞 oaugustopro 11/7/2018 #14

最简单:

Python 3 (英语)

    print('\r' + 'something to be override', end='')

这意味着它会将光标返回到开头,而不是打印某些内容并在同一行中结束。如果在循环中,它将在它开始的同一位置开始打印。

评论

3赞 Shital Shah 2/13/2019
凉!在 Windows 中也有效。
3赞 Tropilio 4/10/2019
谢谢,这对我来说很好用!不过,我认为这更简单。print(’something to be override’, end=‘\r’)
2赞 Miles Mbo 7/24/2019 #15

print()有一个内置参数“end”,默认情况下设置为 Calling is actually calling。 一个简单的方法是打电话给"\n"print("This is America")print("This is America", end = "\n")print("This is America", end ="")

0赞 Mircea 11/15/2019 #16

找到了这个 Quora 帖子,这个例子对我有用(python 3), 这更接近我需要它(即擦除整个前一行)。

他们提供的示例:

def clock():
   while True:
       print(datetime.now().strftime("%H:%M:%S"), end="\r")

要在同一行上打印,正如其他人所建议的那样,只需使用end=""

11赞 MrKulli 12/24/2019 #17

Python 将换行符附加为打印的结尾。使用 end=' ' for python3 for print 方法附加空格而不是换行符。对于 python2,请在 print 语句末尾使用逗号。

print('Foo', end=' ')
print('Bar')
2赞 alio 7/23/2021 #18

此解决方案特定于 Python 3.X:

当我需要这样做时,我通常只使用

end=' '

例如:

# end='' ends the output with a <space> 
print("Welcome to" , end = ' ') 
print("stackoverflow", end = ' ')

其输出为:

Welcome to stackoverflow

中的空格可以替换为任何字符。例如end=

print("Welcome to" , end = '...') 
print("stackoverflow", end = '!')

其输出为:

Welcome to...stackoverflow!