我想运行一个脚本,它基本上显示如下内容:
Installing XXX... [DONE]
现在,我使用print在函数成功后打印整行。但是,现在我希望它首先打印"installing xxx…",在函数运行之后,添加"done"标记;但是在同一行。
有什么想法吗?
如何防止python print添加换行符或空格的可能副本?
这个问题的答案没有提到,有时候你想清除行,请参见:stackoverflow.com/questions/45263205
您可以使用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参数。将其设置为空字符串可防止它在行尾发出新行。
它工作得很好。到目前为止只看到过stdout解决方案。很高兴知道这一点。
如果您同时拥有打印和耗时的操作(所有操作都在同一功能/缩进级别),则此操作不起作用。在操作开始之前,根本没有输出,完成之后,输出显示为整体。
这可能更像是由操作系统为整个进程执行的输出缓冲的函数,而这不是特定于Python的问题。请参阅stackoverflow.com/questions/107705了解特定于python的解决方法。
如果没有换行符,可能需要显式刷新缓冲区。在python 3中使用print("...", end="", flush=True),在python 2中添加一个sys.stdout.flush()调用。
在python 3.x中,您需要在末尾添加一个"r",以替换打印行,而不是附加到它的末尾print("Progress: {}%".format(var), end="
", flush=True)。
如果要覆盖该行,则不要将end=""放在end="
"上,以便光标再次开始。或者在python 2中,将"
"附加到字符串中。注意离开克鲁夫特的短线。可能想用str.ljust(longest)填充。
为了防止有人偶然发现这一点:您还必须调整打印字符串的长度以适应终端线。否则,该线程中的任何方法都不会工作(至少在MacOS 10.13上不工作)。;)
您可以简单地使用:
print 'something',
...
print ' else',
。
输出将是
something else
不需要被import sys过度杀戮。注意末尾的逗号符号。
Python3+print("some string", end="");取下末尾的换行符。阅读更多help(print);
你应该指出逗号
注意,使用此方法有两个空格
这是最简单和最有效的答案。
当打印参数在括号中时,此操作不起作用。此项工作:但此项工作无效
@这对帕伦斯夫妇很有用。打印("您好"),
在python 2和python 3中,print函数的语法稍有不同。
它在Python3.5+中是如何工作的?我试过print("..."),和print("...",)。两者都不起作用。
@cgfox print("string", end="");—阅读文件help(print);。
如果…是需要一段时间才能完成的功能,那么something在else打印之前不会打印。
您应该使用backspace'
'或('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
Python3:
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%。最终值为:
> python test.py
100%
这里是关于flush的其他信息:为什么包含'end='参数的python print语句在while循环中的行为不同?
为了澄清这一点,本例中注释掉的代码似乎是针对python 2的,而未注释的行是针对python 3的。
在python 3中,bouth行可以正常工作。如果使用'x08'作为退格,则需要刷新输出流-print((b'x08'*n).decode(),end='',flush=true)
在Linux上使用python 2.7是不可能的。:(
回车符'
'返回到行首,因此不需要'*n'
@bjnortier,右,纠正
该代码被修复为与Python2.7一起使用。
使用sys.stdout.write('Installing XXX... ')和sys.stdout.write('Done')。这样,如果您想重新创建打印功能,就必须用"
"手工添加新行。我想就为了这个可能没有必要使用诅咒。
谢谢!这个很好用。
我个人更喜欢这个解决方案,因为它在python2.x和python3.x上的工作方式完全相同,不需要依赖__future__进口或类似的东西。
所有的答案都没有对我起作用,因为它们都暂停了,直到遇到新的一行。我写了一个简单的助手:
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"将首先打印出来,并在睡眠前刷新到屏幕上。之后,您可以使用标准打印。
谢谢您!正是我需要的,aka.flush()。
sys.stdout.write将不带回车打印。
import sys
sys.stdout.write("installing xxx")
sys.stdout.write(".")
http://en.wikibooks.org/wiki/python_programming/input_and_output打印_,不带逗号或换行符
这个简单的例子将在同一行上打印1-10。
for i in range(1,11):
print (i, end="")
。
print有一个可选的结束参数,它是最后打印的。默认值是换行符,但可以将其更改为空字符串。打印("你好,世界!",结束=")
它给出语法错误
这是在Python3中。在python 2中,您可以简单地使用print 'something',。结尾的逗号防止添加换行符。
最简单的:Python3
print(‘
’+’something to be override’,end=‘’)
这意味着它会将光标返回到开始位置,而不是打印某个内容,并以同一行结束。如果在循环中,它将在开始的同一位置开始打印。
酷!也适用于Windows。
谢谢,这对我来说很好!不过,我认为print(’something to be override’, end=‘
’)更简单。
如果要覆盖上一行(而不是不断添加),可以在打印语句的末尾将与print(),合并。例如,
from time import sleep
for i in xrange(0, 10):
print("
{0}".format(i)),
sleep(.5)
print("...DONE!")
。
将计数0到9,替换控制台中的旧号码。"...DONE!"将与最后一个计数器9打印在同一行。
对于OP,这将允许控制台将安装完成百分比显示为"进度条",您可以在其中定义开始和结束字符位置,并更新中间的标记。
print("Installing |XXXXXX | 30%"),
号
以下是由@vadim-zin4uk从3.0版本派生的2.7兼容版本:
Python2
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
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字符集返回的回车的字符串表示。它与八进制015〔chr(0o15)、十六进制0d〔chr(0x0d)或十进制13〔chr(13)相同。关于无聊的阅读,请参阅man ascii。它(是一种相当可移植的表示方式,很容易让人们阅读。它非常简单地意味着在不推进纸张的情况下,将打字机上的托架移回起始位置。它是CRLF的CR部分,表示回车和换行。
print()是python 3中的一个函数。在python 2(任何您感兴趣使用的版本)中,通过从__future__模块导入其定义,可以将print强制为函数。print函数的好处是,您可以指定在结束时打印什么,从而覆盖的默认行为,以便在每个print()调用结束时打印新行。
sys.stdout.flush告诉python刷新标准输出的输出,除非另有说明,否则使用print()发送输出。您还可以通过使用python -u运行或设置环境变量PYTHONUNBUFFERED=1来获得相同的行为,从而跳过import sys和sys.stdout.flush()调用。通过这样做所获得的数量几乎为零,如果您很方便地忘记必须在应用程序正常运行之前完成这一步骤,那么就不容易调试。
还有一个样品。请注意,这在Python2或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('
{0:d}'.format(i), end='')
sys.stdout.flush()
time.sleep(ANS / 100.0)
else:
print()
我觉得你的答案更适合:stackoverflow.com/questions/45263205/…
为了防止在数组中预先存储了值,可以使用以下格式调用这些值:
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('
', 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
号
对于python 2.7来说,print是不正确的语法,即使使用正确的语法,代码也不能正常工作。