提问人:user697108 提问时间:4/9/2011 最后编辑:Karl Knechteluser697108 更新时间:1/3/2023 访问量:618609
如何在同一行上打印多个内容,一次打印一个?
How can I print multiple things on the same line, one at a time?
问:
我想运行一个脚本,它基本上显示如下输出:
Installing XXX... [DONE]
目前,我先打印,然后打印。Installing XXX...
[DONE]
我怎样才能在同一行上打印?Installing xxx...
[DONE]
对于在同一行上写入新消息,替换之前存在的内容的具体问题,请参阅如何将以前的打印覆盖到 stdout?。这里的大多数答案将这个问题解释为关于在当前行的末尾编写新文本。
有关使用单次
打印一次输出多个内容的问题,请参阅如何在同一行上一次打印多个内容(固定文本和/或变量值)?。
答:
使用 和 。这样,如果要重新创建打印功能,则必须手动添加新行。我认为可能没有必要为此使用诅咒。sys.stdout.write('Installing XXX... ')
sys.stdout.write('Done')
"\n"
评论
__future__
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 3 解决方案
该函数接受默认为 (new line) 的参数。将其设置为空字符串可防止它在行的末尾发出新行。print()
end
\n
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]"
评论
print("...", end="", flush=True)
sys.stdout.flush()
print("Progress: {}%".format(var), end="\r", flush=True)
您可以简单地使用这个:
print 'something',
...
print ' else',
输出将是
something else
无需矫枉过正。注意末尾的逗号。import sys
Python 3+ 删除末尾的换行符插入。阅读更多print("some string", end="");
help(print);
评论
print
函数在 python 2 和 3 中的语法略有不同。
没有一个答案对我有用,因为它们都暂停了,直到遇到一条新线。我写了一个简单的助手:
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”会先打印出来,在睡觉前刷到屏幕上。之后,您可以使用标准打印。
评论
您应该使用退格键 '\r' 或 ('\x08') char 返回控制台输出中的上一个位置
蟒蛇 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%
在这种情况下,有关flush的其他信息如下:为什么包含“end=”参数的python print语句在while循环中的行为不同?
评论
打印有一个可选的参数,它是最终打印的内容。
默认值为换行符,但您可以将其更改为空字符串。例如:end
print("hello world!", end="")
评论
print 'something',
如果要覆盖上一行(而不是不断添加),可以在 print 语句的末尾组合 with。例如\r
print(),
from time import sleep
for i in xrange(0, 10):
print("\r{0}".format(i)),
sleep(.5)
print("...DONE!")
将计数为 0 到 9,替换控制台中的旧数字。将与最后一个计数器 9 在同一行上打印。"...DONE!"
对于 OP,这将允许控制台将安装完成百分比显示为“进度条”,您可以在其中定义开始和结束字符位置,并更新两者之间的标记。
print("Installing |XXXXXX | 30%"),
以防万一您已将值预先存储在数组中,您可以按以下格式调用它们:
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('\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
这是一个非常古老的线程,但这里有一个非常详尽的答案和示例代码。
\r
是 ASCII 字符集中的 Carriage Return 的字符串表示形式。它与八进制 [] 或十六进制 [] 或十进制 [] 相同。看一个无聊的读物。它()是一个非常便携的表示形式,很容易让人们阅读。它非常简单地意味着将打字机上的托架一直移动到起点,而无需推进纸张。这是表示回车和换行的部分。015
chr(0o15)
0d
chr(0x0d)
13
chr(13)
man ascii
\r
CR
CRLF
print()
是 Python 3 中的一个函数。在 Python 2(您有兴趣使用的任何版本)中,可以通过从模块导入函数的定义来强制函数。该函数的好处是,您可以指定在末尾打印的内容,从而覆盖在每次调用结束时打印换行符的默认行为。print
__future__
print
\n
print()
sys.stdout.flush
告诉 Python 刷新标准输出的输出,除非您另有指定,否则您发送输出的位置。您还可以通过运行 with 或 设置环境变量 来获得相同的行为,从而跳过 和 调用。通过这样做获得的金额几乎正好为零,如果您方便地忘记了在应用程序正常运行之前必须执行该步骤,则调试起来并不容易。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('\r{0:d}'.format(i), end='')
sys.stdout.flush()
time.sleep(ANS / 100.0)
else:
print()
评论
这里有一个 2.7 兼容版本,源自 @Vadim-Zin4uk 的 3.0 版本:
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
两者都已经过测试并有效。
这个简单的示例将在同一行上打印 1-10。
for i in range(1,11):
print (i, end=" ")
最简单:
Python 3 (英语)
print('\r' + 'something to be override', end='')
这意味着它会将光标返回到开头,而不是打印某些内容并在同一行中结束。如果在循环中,它将在它开始的同一位置开始打印。
评论
print(’something to be override’, end=‘\r’)
print()
有一个内置参数“end”,默认情况下设置为 Calling is actually calling。
一个简单的方法是打电话给"\n"
print("This is America")
print("This is America", end = "\n")
print("This is America", end ="")
找到了这个 Quora 帖子,这个例子对我有用(python 3), 这更接近我需要它(即擦除整个前一行)。
他们提供的示例:
def clock():
while True:
print(datetime.now().strftime("%H:%M:%S"), end="\r")
要在同一行上打印,正如其他人所建议的那样,只需使用end=""
Python 将换行符附加为打印的结尾。使用 end=' ' for python3 for print 方法附加空格而不是换行符。对于 python2,请在 print 语句末尾使用逗号。
print('Foo', end=' ')
print('Bar')
此解决方案特定于 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!
评论