在 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) 是一种非常便携的表示形式,并且很容易让人们阅读。非常简单的意思是将打字机上的笔架一直移动到起点,而无需推进纸张。它是CRLFCR 部分,表示回车和换行

print() 是 Python 3 中的一个函数。在 Python 2(您有兴趣使用的任何版本)中,print 可以通过从 __future__ 模块中导入其定义来强制转换为函数。 print 函数的好处是您可以指定最后打印的内容,覆盖\n 的默认行为,在每个print() 调用结束时打印一个换行符。

sys.stdout.flush 告诉 Python 刷新 标准输出 的输出,除非您另外指定,否则您将在其中使用 print() 发送输出。您还可以通过运行python -u 或设置环境变量PYTHONUNBUFFERED=1 来获得相同的行为,从而跳过import syssys.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 的参数在括号中时,这不起作用。这有效: 但这不起作用 @MayankJaiswal 这确实适用于括号。打印('你好'), print 函数在 python 2 VS 3 中的语法略有不同。【参考方案14】:

以防万一您已将值预先存储在数组中,您可以按以下格式调用它们:

for i in range(0,n):
       print arr[i],

【讨论】:

【参考方案15】:

如果要覆盖前一行(而不是不断添加),可以在 print 语句的末尾将 \rprint(), 组合在一起。例如,

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 中的同一行上打印多个的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 的同一行上打印变量和字符串?

在Ruby中的同一行中打印不同大小数组的数组元素

如何在 C++ 中的同一行中获取多个输入?

用python中的Pillow替换动态图像中的同一行像素

在 SQL 的同一行上打印整数变量和字符串

如何使通过公共相关 ID 链接的变量显示在 Splunk 表的同一行上?