在 Python 中的同一行上打印多个
Posted
技术标签:
【中文标题】在 Python 中的同一行上打印多个【英文标题】:multiple prints on the same line in Python 【发布时间】:2011-08-01 16:12:11 【问题描述】:我想运行一个脚本,它基本上显示如下输出:
Installing XXX... [DONE]
目前,我先打印Installing XXX...
,然后再打印[DONE]
。
但是,我现在想在同一行打印 Installing xxx...
和 [DONE]
。
有什么想法吗?
【问题讨论】:
How do I keep Python print from adding newlines or spaces?的可能重复 这个问题的答案不要提到有时候你想清线,见:***.com/questions/45263205 【参考方案1】:此解决方案在 Python 3.X 中具体:
当我需要这样做时,我通常会使用
end=' '
例如:
# end='' ends the output with a <space>
print("Welcome to" , end = ' ')
print("***", end = ' ')
这输出为:
Welcome to ***
end=
中的空格可以替换为任意字符。例如,
print("Welcome to" , end = '...')
print("***", end = '!')
输出如下:
Welcome to...***!
【讨论】:
【参考方案2】:Python 附加换行符作为打印的结束。使用 end=' ' 用于 python3 的打印方法以附加空格而不是换行符。对于 python2,在 print 语句的末尾使用逗号。
print('Foo', end=' ')
print('Bar')
【讨论】:
【参考方案3】:最简单的:
Python 3
print('\r' + 'something to be override', end='')
这意味着它将光标返回到开头,而不是打印一些东西并在同一行结束。如果在一个循环中,它将在它开始的同一个地方开始打印。
【讨论】:
酷!也适用于 Windows。 感谢这对我来说很好!不过,我认为print(’something to be override’, end=‘\r’)
更简单。【参考方案4】:
Print 有一个可选的end
参数,它是最后打印的内容。
默认为换行符,但您可以将其更改为空字符串。例如print("hello world!", end="")
【讨论】:
这是在python 3中。在python 2中,您可以简单地print 'something',
。末尾的逗号可防止添加换行符。【参考方案5】:
找到这个Quora post,这个例子对我有用(python 3), 这更接近我所需要的(即擦除整个前一行)。
他们提供的例子:
def clock():
while True:
print(datetime.now().strftime("%H:%M:%S"), end="\r")
如其他人建议的那样,要在同一行打印,只需使用end=""
【讨论】:
【参考方案6】:print() 有一个内置参数“end”,默认设置为“\n” 调用 print("This is America") 实际上是调用 print("This is America", end = "\n")。 一个简单的方法是调用 print("This is America", end ="")
【讨论】:
【参考方案7】:您应该使用退格键 '\r' 或 ('\x08') 字符返回到控制台输出中的上一个位置
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?
【讨论】:
澄清一下,这个例子中注释掉的代码似乎是针对 Python 2 的,而未注释的行是针对 Python 3 的。 两行在 Python 3 中都可以正常工作。如果使用 '\x08' 作为退格,则需要刷新输出流 - print((b'\x08' * n).decode() , end='', flush=True) 回车'\r'回到行首,所以'* n'是不必要的【参考方案8】:这个简单的例子将在同一行打印 1-10。
for i in range(1,11):
print (i, end=" ")
【讨论】:
【参考方案9】:您可以使用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"
。将其设置为空字符串可防止它在行尾发出新行。
【讨论】:
完美运行。到目前为止只见过标准输出解决方案。很高兴知道这一点。 如果您同时有打印和耗时的操作(都在相同的功能/缩进级别),这不起作用。在动作开始之前,根本没有输出,完成后输出显示为整体 这可能更多是操作系统为整个进程执行的输出缓冲的功能,这不是特定于python的问题。有关特定于 python 的解决方法,请参阅 ***.com/questions/107705。 如果没有换行符,您可能希望显式刷新缓冲区。在 Python 3 中使用print("...", end="", flush=True)
,在 Python 2 中添加 sys.stdout.flush()
调用。
在 python 3.x 中,您需要在结尾添加一个“\r”以替换打印行 VS 附加到它的末尾 print("Progress: %".format(var), end="\r", flush=True)
【参考方案10】:
这里是由@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
两者都已经过测试并且可以工作。
【讨论】:
【参考方案11】:这是一个非常古老的线程,但这里有一个非常彻底的答案和示例代码。
\r
是 ASCII 字符集中 回车 的字符串表示形式。它与八进制 015
[chr(0o15)
] 或十六进制 0d
[chr(0x0d)
] 或十进制 13
[chr(13)
] 相同。无聊的阅读请参阅man ascii
。它 (\r
) 是一种非常便携的表示形式,并且很容易让人们阅读。非常简单的意思是将打字机上的笔架一直移动到起点,而无需推进纸张。它是CRLF
的CR
部分,表示回车和换行。
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('\r0:d'.format(i), end='')
sys.stdout.flush()
time.sleep(ANS / 100.0)
else:
print()
【讨论】:
我觉得你的回答更适合:***.com/questions/45263205/…【参考方案12】:我找到了这个解决方案,它适用于 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
对于 Python 2.7 的语法不正确,即使语法正确,代码也无法工作。【参考方案13】:
你可以简单地使用这个:
print 'something',
...
print ' else',
输出将是
something else
import sys
无需矫枉过正。注意末尾的逗号。
Python 3+
print("some string", end="");
删除末尾的换行符插入。阅读更多help(print);
【讨论】:
注意这个方法有两个空格 这是最简单最有效的答案。 当 print 的参数在括号中时,这不起作用。这有效:print
函数在 python 2 VS 3 中的语法略有不同。【参考方案14】:
以防万一您已将值预先存储在数组中,您可以按以下格式调用它们:
for i in range(0,n):
print arr[i],
【讨论】:
【参考方案15】:如果要覆盖前一行(而不是不断添加),可以在 print 语句的末尾将 \r
与 print(),
组合在一起。例如,
from time import sleep
for i in xrange(0, 10):
print("\r0".format(i)),
sleep(.5)
print("...DONE!")
将从 0 计数到 9,替换控制台中的旧数字。 "...DONE!"
将打印在与最后一个计数器 9 相同的行上。
对于您的 OP,这将允许控制台将安装的完成百分比显示为“进度条”,您可以在其中定义开始和结束字符位置,并更新其间的标记。
print("Installing |XXXXXX | 30%"),
【讨论】:
【参考方案16】:没有一个答案对我有用,因为它们都暂停了,直到遇到新行。我写了一个简单的助手:
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”会在睡眠前先打印出来并刷新到屏幕上。之后,您可以使用标准打印。
【讨论】:
谢谢!正是我需要的 .flush()【参考方案17】:使用sys.stdout.write('Installing XXX... ')
和sys.stdout.write('Done')
。这样,如果您想重新创建打印功能,则必须使用 "\n"
手动添加新行。我认为可能没有必要为此使用诅咒。
【讨论】:
我个人更喜欢这个解决方案而不是投票率更高的解决方案,因为它在 python2.x 和 python3.x 上的工作方式完全相同,无需依赖__future__
导入或类似的东西。【参考方案18】:
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
【讨论】:
以上是关于在 Python 中的同一行上打印多个的主要内容,如果未能解决你的问题,请参考以下文章