如何才能在同一行一次打印多个内容?
- 2024-12-04 08:56:00
- admin 原创
- 158
问题描述:
我想运行一个脚本,它基本上显示如下输出:
Installing XXX... [DONE]
目前,我是Installing XXX...
先打印,然后再打印[DONE]
。
我怎样才能在同一行上打印Installing xxx...
和?[DONE]
有关在同一行上写入新消息、替换之前内容的具体问题,请参阅如何将以前的打印覆盖到标准输出?。这里的大多数答案都将问题解释为在当前行末尾写入新文本。
print
对于使用单个一次输出多个内容的问题,请参阅如何一次在同一行上打印多个内容(固定文本和/或变量值)?。
解决方案 1:
Python 3 解决方案
该print()
函数接受一个end
默认为`
`(新行)的参数。将其设置为空字符串可防止它在行末发出新行。
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]"
解决方案 2:
你可以简单地使用这个:
print 'something',
...
print ' else',
输出将是
something else
无需过度使用import sys
。注意末尾的逗号符号。
Python 3+print("some string", end="");
删除末尾的换行符。阅读更多help(print);
解决方案 3:
您应该使用退格键“ \r ”或(“ ”)字符返回控制台输出中的先前位置
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('
', 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 打印语句在 while 循环中的行为不同?
解决方案 4:
使用sys.stdout.write('Installing XXX... ')
和sys.stdout.write('Done')
。这样,`"
"`如果您想重新创建打印功能,就必须手动添加新行。我认为仅为此使用 curses 可能没有必要。
解决方案 5:
最简单的:
Python 3
print('
' + 'something to be override', end='')
这意味着它将光标返回到开头,然后打印一些内容并在同一行结束。如果在循环中,它将从开始的位置开始打印。
解决方案 6:
这些答案都对我不起作用,因为它们都暂停了,直到遇到新行。我写了一个简单的助手:
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”并刷新到屏幕上。之后,您可以使用标准打印。
解决方案 7:
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
解决方案 8:
Python 附加换行符作为打印的结束。对于 python3,使用 end=' ' 作为打印方法附加空格而不是换行符。对于 python2,在打印语句末尾使用逗号。
print('Foo', end=' ')
print('Bar')
解决方案 9:
这个简单的例子将在同一行打印1-10。
for i in range(1,11):
print (i, end=" ")
解决方案 10:
Print 有一个可选end
参数,它是最后打印的内容。默认是换行符,但你可以将其更改为空字符串。例如print("hello world!", end="")
解决方案 11:
如果要覆盖上一行(而不是不断添加),可以在 print 语句的末尾结合使用`。
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%"),
解决方案 12:
这里是由@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}
'.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}
'.format(s), end='') # just print and flush
time.sleep(0.2) # sleep for 200ms
两者均已测试并可正常运行。
解决方案 13:
这是一个非常古老的话题,但这里有一个非常详尽的答案和示例代码。
`是ASCII 字符集中的*回车符*的字符串表示。它与八进制
015[
chr(0o15)] 或十六进制
0d[
chr(0x0d)] 或十进制
13[
chr(13)] 相同。请
man ascii参阅 以了解无聊的内容。它 (
) 是一种非常便携的表示,人们很容易阅读。它非常简单地意味着将打字机上的托架一直移回到开头而不推进纸张。它是表示*回车符和换行符*
CR的部分。
CRLF`
print()
是 Python 3 中的一个函数。在 Python 2(任何您感兴趣的版本)中,print
可以通过从__future__
模块导入其定义来强制将其放入函数中。该函数的好处print
是您可以指定在末尾打印的内容,从而覆盖`在每次调用结束时打印换行符的默认行为
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('
{0:d}'.format(i), end='')
sys.stdout.flush()
time.sleep(ANS / 100.0)
else:
print()
解决方案 14:
此解决方案特定于 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!
解决方案 15:
print()
有一个内置参数“end”,默认情况下设置为`"
"`
调用print("This is America")
实际上是在调用`print("This is America", end = "
")。一个简单的方法是调用
print("This is America", end ="")`
解决方案 16:
如果您已将值预先存储在数组中,则可以按照以下格式调用它们:
for i in range(0,n):
print arr[i],
解决方案 17:
找到这个Quora帖子,其中的示例对我有用(python 3),它更接近我需要的(即删除整行)。
他们提供的例子:
def clock():
while True:
print(datetime.now().strftime("%H:%M:%S"), end="
")
正如其他人所建议的那样,为了在同一行上打印,只需使用end=""
解决方案 18:
我找到了这个解决方案,它适用于 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