我想运行一个脚本,基本上显示了这样的输出:
Installing XXX... [DONE]
当前,我先打印Installing XXX...
,然后再打印[DONE]
。
但是,我现在想在同一行上打印Installing xxx...
和[DONE]
。
有什么想法吗?
您可以使用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"
参数。将其设置为空字符串可防止其在行尾发布新行。
如果要覆盖前一行(而不是不断添加),则可以在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%"),
这里是@ 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
都经过测试和工作。
这是一个非常古老的线程,但是这里有一个非常详尽的答案和示例代码。
\r
是ASCII字符集中的回车的字符串表示形式。与八进制015
[chr(0o15)
]或十六进制0d
[chr(0x0d)
]或十进制13
[chr(13)
]相同。参见man ascii
进行无聊的阅读。它(\r
)是一种非常可移植的表示形式,足以使人们阅读。这很简单,就是在不推进纸张的情况下将打字机上的笔架一直移动到起点。这是CR
的CRLF
部分,表示回车和换行。
print()
是Python 3中的函数。在Python 2(您可能会感兴趣的任何版本)中,可以通过从print
模块中导入其定义将__future__
强制为函数。 print
函数的好处是您可以指定要在末尾打印的内容,从而覆盖了\n
的默认行为,以便在每个print()
调用的末尾打印换行符。
sys.stdout.flush
告诉Python刷新标准输出的输出,除非另行指定,否则您将使用print()
发送输出。通过使用python -u
运行或设置环境变量PYTHONUNBUFFERED=1
,从而跳过import sys
和sys.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()
print()具有内置参数“ end”,默认情况下设置为“ \ n”调用print(“ This is America”)实际上是调用print(“ This is America”,end =“ \ n”)。一种简单的方法是调用print(“ This is America”,end =“”)
如果您已将值预先存储在数组中,则可以按以下格式调用它们:
for i in range(0,n):
print arr[i],
找到了这个Quora post,这个例子对我有用(python 3),这更接近我需要的功能(即删除前一行)。
他们提供的示例:
def clock():
while True:
print(datetime.now().strftime("%H:%M:%S"), end="\r")
如其他人所建议,要在同一行上打印,只需使用end=""
我找到了这个解决方案,并且可以在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
您可以简单地使用此:
print 'something',
...
print ' else',
输出将是
something else
无需通过import sys
来过度杀伤。注意结尾的逗号符号。
Python 3 +print("some string", end="");
删除末尾的换行符。阅读更多help(print);
您应该使用退格键'\ 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?
使用sys.stdout.write('Installing XXX... ')
和sys.stdout.write('Done')
。这样,如果要重新创建打印功能,则必须用"\n"
手动添加新行。我认为可能不必为此仅使用诅咒。
没有答案对我有用,因为它们都暂停了,直到遇到新的一行。我写了一个简单的助手:
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”将首先打印出来,然后在睡眠前冲洗到屏幕。之后,您可以使用标准打印。
[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
此简单示例将在同一行上打印1-10。
for i in range(1,11):
print (i, end=" ")
Print有一个可选的end参数,它是最后打印的内容。默认值为换行符,但您可以将其更改为空字符串。例如:print(“ hello world!”,end =“”)
print(‘\r’+’something to be override’,end=‘’)
这意味着它将使光标返回到开始,而不是将打印某些内容并在同一行结束。如果处于循环状态,它将在开始的位置开始打印。