【问题标题】:multiple prints on the same line in Python在 Python 中的同一行上打印多个
【发布时间】:2011-08-01 16:12:11
【问题描述】:

我想运行一个脚本,它基本上显示如下输出:

Installing XXX...               [DONE]

目前,我先打印Installing XXX...,然后再打印[DONE]

但是,我现在想在同一行打印 Installing xxx...[DONE]

有什么想法吗?

【问题讨论】:

标签: python printing stdout line-breaks


【解决方案1】:

此解决方案在 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!

【讨论】:

    【解决方案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 的解决方法,请参阅 stackoverflow.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('\r{0:d}'.format(i), end='')
                      sys.stdout.flush()
                      time.sleep(ANS / 100.0)
              else:
                  print()
              

              【讨论】:

              【解决方案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("\r{0}".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

                  【讨论】:

                    猜你喜欢
                    • 2018-02-18
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多