Python:在同一行上打印多个

问题描述 投票:196回答:14

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

Installing XXX...               [DONE]

现在,此刻,我在功能成功后使用print打印整行。但是,我现在希望它首先打印“安装xxx ...”,并在功能运行之后添加“DONE”标签;但是在同一条线上。

有任何想法吗?

python printing
14个回答
254
投票

您可以使用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]")

print函数接受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字符集中Carriage Return的字符串表示形式。它与八角形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()

1
投票

如果您已将值预先存储在数组中,可以使用以下格式调用它们:

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

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


43
投票

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


43
投票

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


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

“你好”将首先打印出来并在睡眠前冲到屏幕上。之后,您可以使用标准打印。


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


8
投票

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

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

7
投票

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


6
投票

Most simple:

Python 3

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

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

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