Python: multiple prints on the same line
我想运行一个脚本,它基本上显示如下内容:
1 | Installing XXX... [DONE] |
现在,我使用print在函数成功后打印整行。但是,现在我希望它首先打印"installing xxx…",在函数运行之后,添加"done"标记;但是在同一行。
有什么想法吗?
您可以使用
1 2 3 4 5 | def install_xxx(): print"Installing XXX... ", install_xxx() print"[DONE]" |
号
python 3解决方案由于上面的内容在python 3中不起作用,您可以这样做(同样,不导入
1 2 3 4 5 | def install_xxx(): print("Installing XXX... ", end="", flush=True) install_xxx() print("[DONE]") |
print函数接受默认为
"
您可以简单地使用:
1 2 3 | print 'something', ... print ' else', |
。
输出将是
1 | something else |
不需要被
Python3+
您应该使用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循环中的行为不同?
使用
"
所有的答案都没有对我起作用,因为它们都暂停了,直到遇到新的一行。我写了一个简单的助手:
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"将首先打印出来,并在睡眠前刷新到屏幕上。之后,您可以使用标准打印。
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=‘’) |
这意味着它会将光标返回到开始位置,而不是打印某个内容,并以同一行结束。如果在循环中,它将在开始的同一位置开始打印。
如果要覆盖上一行(而不是不断添加),可以在打印语句的末尾将
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,替换控制台中的旧号码。
对于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 |
两者都经过测试和工作。
这是一个非常古老的线程,但这里有一个非常彻底的答案和示例代码。
还有一个样品。请注意,这在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 |
号