关于打印:Python:在同一行上打印多个

Python: multiple prints on the same line

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

1
Installing XXX...               [DONE]

现在,我使用print在函数成功后打印整行。但是,现在我希望它首先打印"installing xxx…",在函数运行之后,添加"done"标记;但是在同一行。

有什么想法吗?


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

1
2
3
4
5
def install_xxx():
   print"Installing XXX...     ",

install_xxx()
print"[DONE]"

print行末尾的逗号防止print发出新的行(您应该注意,输出末尾将有一个额外的空间)。

python 3解决方案由于上面的内容在python 3中不起作用,您可以这样做(同样,不导入sys):

1
2
3
4
5
def install_xxx():
    print("Installing XXX...     ", end="", flush=True)

install_xxx()
print("[DONE]")

print函数接受默认为"
"
end参数。将其设置为空字符串可防止它在行尾发出新行。


您可以简单地使用:

1
2
3
print 'something',
...
print ' else',

输出将是

1
something else

不需要被import sys过度杀戮。注意末尾的逗号符号。

Python3+print("some string", end="");取下末尾的换行符。阅读更多help(print);


您应该使用backspace'
'或('x08')char返回控制台输出中的上一个位置。

python 2+:

1
2
3
4
5
6
7
8
9
10
11
12
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

Python3:

1
2
3
4
5
6
7
8
9
10
11
12
13
import time  

def backline():        
    print('
'
, end='')                     # use '
' 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%。最终值为:

1
2
> python test.py
100%

这里是关于flush的其他信息:为什么包含'end='参数的python print语句在while循环中的行为不同?


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


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

1
2
3
4
def print_no_newline(string):
    import sys
    sys.stdout.write(string)
    sys.stdout.flush()

要测试它:

1
2
3
4
5
import time
print_no_newline('hello ')
# Simulate a long task
time.sleep(2)
print('world')

"Hello"将首先打印出来,并在睡眠前刷新到屏幕上。之后,您可以使用标准打印。


sys.stdout.write将不带回车打印。

1
2
3
import sys
sys.stdout.write("installing xxx")
sys.stdout.write(".")

http://en.wikibooks.org/wiki/python_programming/input_and_output打印_,不带逗号或换行符


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

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


print有一个可选的结束参数,它是最后打印的。默认值是换行符,但可以将其更改为空字符串。打印("你好,世界!",结束=")


最简单的:Python3

1
2
    print(
’+’something to be override’,end=‘’)

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


如果要覆盖上一行(而不是不断添加),可以在打印语句的末尾将
print(),合并。例如,

1
2
3
4
5
6
7
8
from time import sleep

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

print("...DONE!")

将计数0到9,替换控制台中的旧号码。"...DONE!"将与最后一个计数器9打印在同一行。

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

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


以下是由@vadim-zin4uk从3.0版本派生的2.7兼容版本:

Python2

1
2
3
4
5
6
7
8
import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print '{0}
'
.format(s),                # just print and flush

    time.sleep(0.2)

因此,提供的3.0解决方案看起来有点臃肿。例如,backspace方法没有使用integer参数,可能完全可以去掉它。

Python3

1
2
3
4
5
6
7
8
import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print('{0}
'
.format(s), end='')        # just print and flush

    time.sleep(0.2)                         # sleep for 200ms

两者都经过测试和工作。


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


是从ASCII字符集返回的回车的字符串表示。它与八进制015chr(0o15)、十六进制0dchr(0x0d)或十进制13chr(13)相同。关于无聊的阅读,请参阅man ascii。它(
是一种相当可移植的表示方式,很容易让人们阅读。它非常简单地意味着在不推进纸张的情况下,将打字机上的托架移回起始位置。它是CRLFCR部分,表示回车和换行。

print()是python 3中的一个函数。在python 2(任何您感兴趣使用的版本)中,通过从__future__模块导入其定义,可以将print强制为函数。print函数的好处是,您可以指定在结束时打印什么,从而覆盖
的默认行为,以便在每个print()调用结束时打印新行。

sys.stdout.flush告诉python刷新标准输出的输出,除非另有说明,否则使用print()发送输出。您还可以通过使用python -u运行或设置环境变量PYTHONUNBUFFERED=1来获得相同的行为,从而跳过import syssys.stdout.flush()调用。通过这样做所获得的数量几乎为零,如果您很方便地忘记必须在应用程序正常运行之前完成这一步骤,那么就不容易调试。

还有一个样品。请注意,这在Python2或3中运行得很好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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('
{0:d}'
.format(i), end='')
        sys.stdout.flush()
        time.sleep(ANS / 100.0)
else:
    print()


为了防止在数组中预先存储了值,可以使用以下格式调用这些值:

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


我找到了这个解决方案,它正在开发python 2.7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Working on Python 2.7 Linux

import time
import sys


def backspace(n):
    print('
'
, end='')                     # use '
' 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