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

281

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

Installing XXX...               [DONE]

目前,我先打印 正在安装XXX...,然后再打印[完成]

我该如何在同一行上打印正在安装xxx...[完成]呢?


针对在同一行上写入新消息并替换之前内容的具体问题,请参见如何覆盖先前的stdout打印内容?。大多数答案都将问题解释为在当前行末尾写入新文本。

若要在单个print语句中输出多个内容,请参见如何同时打印多个文本和/或变量值?


2
可能是重复的问题:如何防止Python的print函数添加换行符或空格? - Cees Timmerman
1
这个问题的答案没有提到有时候你想要清除行,参见:https://dev59.com/66Pia4cB1Zd3GeqP2K2a - ideasman42
18个回答

331

Python 3 解决方案

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
5
如果在同一个函数/缩进层级中既有输出语句,又有耗时操作,那么这种方法就不起作用了。在操作开始之前,没有任何输出,而在操作完成后,整个输出一起出现。 - Paddre
2
这可能更多是由操作系统对整个进程执行的输出缓冲处理函数造成的,这不是Python特有的问题。请参见https://dev59.com/inVD5IYBdhLWcg3wDHDm以获取Python特定的解决方法。 - multipleinterfaces
17
如果没有换行符,你可能需要显式刷新缓冲区。在Python 3中使用print("...", end="", flush=True),在Python 2中添加sys.stdout.flush()调用即可。 - Martijn Pieters
12
在Python 3.x中,您需要添加"\r"来代替打印行的末尾,而不是将其附加到末尾。例如:print("Progress: {}%".format(var), end="\r", flush=True) - John
显示剩余3条评论

110

你可以直接使用这个:

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

输出结果将会是:

something else

导入 sys 是不必要的,不要过度使用。注意在末尾使用逗号。

Python 3+ 使用 print("some string", end=""); 可以去掉末尾插入的换行符。了解更多请阅读 help(print);


3
注意:使用这种方法时需要输入两个空格。 - ethanjyx
1
这是最简单和最有效的答案。 - gixxer
@MayankJaiswal 这个带括号的确是可以工作的。 print('hello'), - drglove
1
在Python 2和3中,“print”函数的语法略有不同。 - boldnik
@CGFoX print("string", end=""); - 阅读文档 help(print); - boldnik
显示剩余5条评论

66

你应该使用回退键 '\r' 或者 ('\x08') 字符来返回到控制台输出的前一个位置

Python 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的其他信息,请查看此处:Why do python print statements that contain 'end=' arguments behave differently in while-loops?


1
澄清一下,在这个例子中,被注释掉的代码看起来是用于Python 2的,而非注释的行是用于Python 3的。 - Turtles Are Cute
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Vadim Zin4uk
1
回车符“\r”会回到行的开头,因此“*n”是不必要的。 - bjnortier

42

使用 sys.stdout.write('Installing XXX... ')sys.stdout.write('Done')。这种方式下,如果想要重新创建打印功能,就必须手动添加换行符"\n"。我认为可能没有必要仅仅为此目的使用curses。


4
我个人更喜欢这种解决方案,因为它在python2.x和python3.x上的工作方式完全相同,而且不需要依赖于__future__导入或类似的内容。 - mgilson

30

最简单的:

Python 3

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

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


3
太棒了!在Windows上也能用。 - Shital Shah
3
谢谢,这对我很有效!不过我认为“print('something to be override', end='\r')”更简单。 - Tropilio

18

因为所有的答案都会在遇到新行之前暂停,所以它们都不适用于我。我写了一个简单的帮助器:

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 "将首先被打印并刷新到屏幕上。之后您可以使用标准的print函数。


2
谢谢!正是我所需要的,即 .flush()。 - Obi-Wan

14

11

Python在打印输出时会默认添加换行符。在Python3中,可以使用end=' '参数来在print方法输出的末尾添加空格代替换行符;而在Python2中,则需要在print语句的末尾使用逗号。

print('Foo', end=' ')
print('Bar')

9

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

for i in range(1,11):
    print (i, end=" ")

9

Print函数有一个可选的end参数,它是在输出结束时打印的内容。 默认情况下,它是一个换行符,但你可以将其更改为空字符串。例如:print("hello world!", end="")


2
这是Python 3的代码。在Python 2中,你可以简单地使用print 'something',命令。末尾的逗号可以防止换行。 - arjoonn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接