在Python中多行打印在同一行上

问题描述 投票:211回答:16

我想运行一个脚本,基本上显示了这样的输出:

Installing XXX...               [DONE]

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

但是,我现在想在同一行上打印Installing xxx...[DONE]

有什么想法吗?

python printing stdout line-breaks
16个回答
267
投票

您可以使用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"参数。将其设置为空字符串可防止其在行尾发布新行。


4
投票

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

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%"),

3
投票

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

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)是一种非常可移植的表示形式,足以使人们阅读。这很简单,就是在不推进纸张的情况下将打字机上的笔架一直移动到起点。这是CRCRLF部分,表示回车和换行

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],

0
投票

找到了这个Quora post,这个例子对我有用(python 3),这更接近我需要的功能(即删除前一行)。

他们提供的示例:

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

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


-3
投票

我找到了这个解决方案,并且可以在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

102
投票

您可以简单地使用此:

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

输出将是

something else

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

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


45
投票

您应该使用退格键'\ 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%

在这种情况下,有关冲洗的其他信息:Why do python print statements that contain 'end=' arguments behave differently in while-loops?


43
投票

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


16
投票

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

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


14
投票

[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


9
投票

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

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

7
投票

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


7
投票

最简单:

Python 3

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

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

© www.soinside.com 2019 - 2024. All rights reserved.