Python在同一行打印
我想运行一个脚本,它基本上显示如下内容:
Installing XXX... [DONE]
现在,在此function成功后,我使用print打印整行。 不过,我现在要先打印“正在安装xxx …”,并且在该function运行之后,添加“DONE”标签; 但在同一行。
有任何想法吗?
您可以使用print
语句来执行此操作,而无需导入sys
。
def install_xxx(): print("Installing XXX... "), install_xxx() print "[DONE]"
print
行末尾的逗号可防止print
发出新行(应注意,输出结尾处会有额外的空格)。
Python 3解决scheme
由于上述内容在Python 3中不起作用,所以可以这样做(再次,不需要导入sys
):
def install_xxx(): print("Installing XXX... ", end="") install_xxx() print("[DONE]")
打印function接受默认为"\n"
的end
参数。 将其设置为空string可防止在行尾发出新行。
你可以简单地使用这个:
print 'something', ... print ' else',
和输出将是
something else
没有必要通过import sys
来矫枉过正。 最后注意逗号符号。
Python 3+ print("some string", end="");
在最后删除换行符。 阅读更多的help(print);
使用sys.stdout.write('Installing XXX... ')
和sys.stdout.write('Done')
。 这样,如果要重新创build打印function,则必须手动添加新行"\n"
。 我认为可能没有必要为此使用curses。
正确答案! 您必须使用退格符 “ \ r ”或(' \ x08 ')char返回控制台输出中以前的位置
Python 3:
import time import sys def backspace(n): # print((b'\x08').decode(), end='') # use \x08 char to go back 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 # sys.stdout.flush() # needed for flush when using \x08 backspace(len(s)) # back for n chars time.sleep(0.2) # sleep for 200ms
这个代码将在一行中从0%到100%计数。 最终的价值将是:
> python test.py 100%
在这种情况下有关flush的附加信息: 为什么包含'end ='参数的python打印语句在while循环中performance不同?
因为他们都暂停,直到遇到新的线路,没有答案为我工作。 我写了一个简单的帮手:
def print_no_newline(string): import sys sys.stdout.write(string) sys.stdout.flush()
testing它:
import time print_no_newline('hello ') # Simulate a long task time.sleep(2) print('world')
“你好”将首先打印出来,并在睡眠之前刷新屏幕。 之后,您可以使用标准打印。
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
打印有一个可选的结束参数,它是打印到底。 默认是换行符,但可以将其更改为空string。 例如:print(“hello world!”,end =“”)
如果要覆盖上一行(而不是不断添加),可以在打印语句的末尾将\r
与print(),
组合起来。 例如,
from time import sleep for i in xrange(0, 10): print("\r{0}".format(i)), sleep(.5) print("...DONE!")
将计数0到9,replace控制台中的旧号码。 "...DONE!"
将打印在最后一个计数器的同一行上,9。
在你的情况下,这将允许控制台显示安装完成百分比作为“进度条”,在那里你可以定义一个开始和结束字符位置,并更新之间的标记。
print("Installing |XXXXXX | 30%"),
为了防止您将值存储在数组中,可以按照以下格式调用它们:
for i in range(0,n): print arr[i],
这是一个非常古老的线程,但是这里有一个非常全面的答案和示例代码。
\r
是ASCII字符集中回车符的string表示。 它与八进制015
[ chr(0o15)
]或hex0d
[ chr(0x0d)
]或十进制13
[ chr(13)
]相同。 看到一个无聊的阅读man ascii
。 它( \r
)是一个非常便携的代表,很容易让人阅读。 这非常简单地意味着在没有推进纸张的情况下将打字机上的车厢一直移回到起点。 这是CRLF
的CR
部分,这意味着回车和 CRLF
行 。
print()
是Python 3中的一个函数。在Python 2(任何你感兴趣的版本)中, print
可以通过从__future__
模块导入它的定义来强制进入函数。 print
function的好处是,您可以指定最后打印的内容,覆盖\n
的默认行为以在每次print()
调用结束时打印一个换行符。
sys.stdout.flush
告诉Python刷新标准输出的输出 ,除非另有指定,否则这是您使用print()
发送输出的地方。 您也可以通过使用python -u
或设置环境variablesPYTHONUNBUFFERED=1
来获得相同的行为,从而跳过import sys
和sys.stdout.flush()
调用。 如果您忘记了必须在应用程序正常运行之前执行此操作,那么通过这样做所获得的数量几乎为零,并且不容易debugging。
还有一个样本。 请注意,这在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()
我发现这个解决scheme,它正在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