在Python中,同一行上的多个打印

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

Installing XXX...               [DONE]

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

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

什么好主意吗?

595156 次浏览

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

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

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

你可以简单地使用这个:

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

输出将是

something else

没有必要过度使用import sys。注意结尾的逗号符号。

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

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

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”将首先打印出来,并在睡眠前刷新到屏幕上。之后你就可以使用标准打印了。

你应该使用退格'r \'或('\ (')字符返回控制台输出中的前一个位置

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的附加信息:为什么python打印包含'end='参数在while循环中表现不同?

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

如果你想覆盖前一行(而不是不断地添加),你可以在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%"),

如果你预先将值存储在数组中,你可以用下面的格式调用它们:

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

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

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

\r是ASCII字符集中0151的字符串表示形式。它与八进制015 [chr(0o15)]或十六进制0d [chr(0x0d)]或十进制13 [chr(13)]相同。看man ascii的无聊阅读。它(\r)是一个相当可移植的表示法,对人们来说足够容易阅读。它非常简单地意味着将打字机上的架子一直移动到起点,而不前进纸张。它是0150的CR部分,也就是0152。

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()

下面是@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提供的解决方案看起来有点臃肿。例如,backspace方法不使用整型参数,可以完全取消。

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

这两种方法都经过了测试,并且有效。

这个简单的例子将在同一行打印1-10个字符。

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

最简单的:

Python 3

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

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

print()有一个内置参数"end"默认设置为"\n" 调用print("This is America")实际上是调用print("This is America", end = "\n")。 一个简单的方法是调用print("This is America", end ="")

找到这个Quora的帖子,用这个例子为我工作(python 3), 这更接近于我需要它(即擦除前一行)。

他们提供的例子是:

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

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

Python将换行符作为输出的结束符。使用end=' ' for python3 for print方法添加一个空格而不是换行符。对于python2,在print语句的末尾使用逗号。

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

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!