在Python的同一行上有多个打印


229

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

Installing XXX...               [DONE]

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

不过,我现在想打印Installing xxx...[DONE]在同一行。

有任何想法吗?



1
这个问题的答案没有提到有时候您想清除界限,请参见:stackoverflow.com/questions/45263205
ideaman42 '17

Answers:


284

您可以使用该print语句执行此操作,而无需导入sys

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

install_xxx()
print "[DONE]"

行尾的逗号会print阻止print发出新行(您应注意,输出末尾会有多余的空格)。

Python 3解决方案
由于上述内容在Python 3中不起作用,因此您可以改为这样做(同样,不导入sys):

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

install_xxx()
print("[DONE]")

打印功能接受end默认值为的参数"\n"。将其设置为空字符串可防止它在该行的末尾发出新行。


1
它完美地工作。到目前为止,只见过stdout解决方案。很高兴知道这一点。
Prometheus 2015年

5
如果您同时拥有打印件和两者之间的耗时操作(全部在相同的功能/缩进级别中),则此操作将无效。在操作开始之前,根本没有任何输出,完成之后,输出将整体显示
Paddre

2
这可能更多是由OS为整个过程执行的输出缓冲功能,这不是特定于python的问题。有关特定于Python的解决方法,请参见stackoverflow.com/questions/107705
多个接口

13
没有换行符,您可能要显式刷新缓冲区。print("...", end="", flush=True)在Python 3中使用,在Python 2中添加sys.stdout.flush()调用。
马丁·彼得斯

7
在python 3.x中,您将需要添加一个“ \ r”以替换附加在其末尾的打印行VSprint("Progress: {}%".format(var), end="\r", flush=True)
John

103

您可以简单地使用:

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

和输出将是

something else

无需过度杀伤import sys。注意末尾的逗号符号。

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


3
请注意,使用此方法有两个空格
ethanjyx13年

1
这是最简单,最有效的答案。
gixxer 2015年

当打印参数放在括号中时,这不起作用。这有效:<print“ hello” ,; print(“ hello”)>,但这不起作用<print(“ hello”,); print(“ hello”)>
Mayank Jaiswal

@MayankJaiswal这适用于父母。print('hello'),
drglove

1
print函数具有稍微不同的语法在Python 2 VS 3
boldnik

52

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

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%

在这种情况下,有关刷新的其他信息在这里:为什么包含'end ='参数的python打印语句在while循环中的行为不同?


1
为了澄清,它看起来像在本实施例中的注释的代码是用于Python 2,和所述非注释行是用于Python 3.
海龟很可爱

1
底行可以在Python 3中正常工作。如果使用'\ x08'作为退格键,则需要刷新输出流-print((b'\ x08'* n).decode(),end ='',flush = True)
Vadim Zin4uk 2015年

1
回车符'\ r'返回到该行的开头,因此'* n'是不必要的
bjnortier

43

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


4
我个人更喜欢这种解决方案,而不是票数较高的解决方案,因为它在python2.x和python3.x上的工作方式完全相同,而无需依赖__future__导入或类似的操作。
mgilson

17

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

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”将首先打印出来,然后在睡眠前冲洗到屏幕。之后,您可以使用标准打印。


1
谢谢!正是我需要的.flush()
MrNice


11

最简单的:

Python 3

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

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


3
凉!在Windows中也可以使用。
Shital Shah,

2
谢谢,这对我来说很好!我认为这print(’something to be override’, end=‘\r’)比较简单。
Tropilio


9

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


2
这是在python 3中。在python 2中,您可以简单地print 'something',。末尾的逗号阻止添加换行符。
arjoonn

4

如果你想覆盖前一行(而不是不断地增加它),你可以结合\r使用 print(),,在打印语句的结束。例如,

from time import sleep

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

print("...DONE!")

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

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

print("Installing |XXXXXX              | 30%"),

4

这里是@ Vadim-Zin4uk从3.0版本派生的2.7兼容版本:

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解决方案看起来有些looks肿。例如,退格方法不使用整数参数,可能完全可以使用。

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

两者都已经过测试和工作。


2

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

\r是ASCII字符集的回车的字符串表示形式。与八进制015[ chr(0o15)]或十六进制0d[ chr(0x0d)]或十进制13[ chr(13)]相同。请参阅man ascii无聊的阅读。它(\r)是一种可移植的表示形式,足以让人们阅读。这很简单,就是在不推进纸张的情况下将打字机上的笔架一直移动到起点。这是CR一部分CRLF,这意味着回车和换行

print()是Python 3中的函数。在Python 2(您可能会感兴趣的任何版本)中,print可以通过从__future__模块中导入函数的定义来强制使用该函数。该print功能的好处在于,您可以指定在\n结尾处打印的内容,而不是在每次print()调用结束时打印换行符的默认行为。

sys.stdout.flush告诉Python刷新标准输出的输出,print()除非您另外指定,否则发送标准输出的位置。您还可以通过运行python -u或设置环境变量来获得相同的行为PYTHONUNBUFFERED=1,从而跳过import 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()


2

print()具有内置参数“ end”,默认情况下设置为“ \ n”。调用print(“ This is America”)实际上是调用print(“ This is America”,end =“ \ n”)。一种简单的方法是调用print(“ This is America”,end =“”)


1

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

for i in range(0,n):
       print arr[i],

1

Python附加换行符作为打印结束。对于print3的python3使用end =''来添加空格而不是换行符。对于python2,请在打印语句末尾使用逗号。

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

0

找到此Quora帖子,并找到适用于我的示例(python 3),该示例更接近于我需要的示例(即,删除了前一行)。

他们提供的示例:

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

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


-2

我找到了这个解决方案,并且可以在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
print对于Python 2.7是不正确的语法,即使使用正确的语法,代码也无法正常工作。
科里·马登
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.