我想运行一个脚本,它基本上显示如下输出:
Installing XXX... [DONE]
目前,我打印安装XXX…首先,然后打印[完成]。
我怎么能打印安装xxx…和[DONE]在同一行?
关于在同一行上写入新消息,替换之前的内容的具体问题,请参见如何将先前的打印内容覆盖到标准输出?。这里的大多数答案都把这个问题理解为在当前行的末尾写新的文本。
有关使用单个打印一次输出多个内容的问题,请参见如何在同一行上一次性打印多个内容(固定文本和/或变量值)。
我想运行一个脚本,它基本上显示如下输出:
Installing XXX... [DONE]
目前,我打印安装XXX…首先,然后打印[完成]。
我怎么能打印安装xxx…和[DONE]在同一行?
关于在同一行上写入新消息,替换之前的内容的具体问题,请参见如何将先前的打印内容覆盖到标准输出?。这里的大多数答案都把这个问题理解为在当前行的末尾写新的文本。
有关使用单个打印一次输出多个内容的问题,请参见如何在同一行上一次性打印多个内容(固定文本和/或变量值)。
使用sys.stdout。写(“安装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()函数接受一个结束参数,默认为\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
不需要过多的导入系统。注意结尾的逗号符号。
Python 3 + Print ("some string", end="");删除末尾的换行插入。阅读更多帮助(打印);
没有一个答案对我有用,因为它们都暂停了,直到遇到新的一行。我写了一个简单的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'或('\x08')字符返回控制台输出中的先前位置
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="")
如果你想覆盖前一行(而不是不断地添加),你可以在print语句的末尾将\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%"),
我找到了这个解决方案,它在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字符集回车的字符串表示形式。它与八进制015 [chr(0o15)]或十六进制0d [chr(0x0d)]或十进制13 [chr(13)]相同。看man ascii,无聊的阅读。它(\r)是一种相当可移植的表示法,并且易于人们阅读。它非常简单地意味着将打字机上的架子一直移动到起点,而不前进纸张。这是CRLF的CR部分,意思是回车和换行。
print()是Python 3中的一个函数。在Python 2(任何你感兴趣的版本)中,可以通过从__future__模块导入其定义来将print强制导入函数。print函数的好处是,您可以指定在末尾打印什么,覆盖\n的默认行为,在每次print()调用的末尾打印换行符。
sys.stdout.flush tells Python to flush the output of standard output, which is where you send output with print() unless you specify otherwise. You can also get the same behavior by running with python -u or setting environment variable PYTHONUNBUFFERED=1, thereby skipping the import sys and sys.stdout.flush() calls. The amount you gain by doing that is almost exactly zero and isn't very easy to debug if you conveniently forget that you have to do that step before your application behaves properly.
还有一个样本。请注意,这在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
这两种方法都经过了测试,并且有效。
最简单的:
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!