14 题: Python:在同一行上打印多个

在...创建的问题 Wed, Mar 7, 2018 12:00 AM

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

 
Installing XXX...               [DONE]

现在,在此功能成功后,我使用print打印整行。但是,我现在希望它首先打印“安装xxx ...”,并在功能运行之后添加“DONE”标签;但是在同一条线上。

有什么想法吗?

    
197
  1. 2016-12-09 02:21:20Z
  2. 这个问题的答案没有提及有时你想要清除该行,请参阅: stackoverflow.com/questions/45263205
    2017-07-23 09:44:57Z
  3. 醇>
    14答案                              14 跨度>                         

    您可以使用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]")
    

    print函数接受end参数,默认为"\n"。将其设置为空字符串可防止它在该行的末尾发出新行。

        
    253
    2018-03-07 21:57:58Z
    1. 它完美无缺。到目前为止只见过stdout解决方案。非常高兴知道这一点。
      2015-01-08 07:59:14Z
    2. 如果您同时拥有两个打印和耗时的操作(所有这些都在相同的函数/缩进级别),则此方法不起作用。在操作开始之前,根本没有输出,在完成后输出显示为整个
      2015-02-20 15:08:45Z
    3. 这可能更多地是操作系统为整个过程执行的输出缓冲功能,这不是特定于python的问题。有关特定于python的解决方法,请参见 stackoverflow.com/questions/107705
      2015-02-20 16:48:51Z
    4. 如果没有换行符,您可能希望显式刷新缓冲区。在Python 3中使用print("...", end="", flush=True),在Python 2中添加sys.stdout.flush()调用。
      2016-11-03 12:53:09Z
    5. python 3.x中的
      你要添加一个“\r”来结束替换打印的行VS追加到它的末尾print("Progress: {}%".format(var), end="\r", flush=True)
      2018-01-06 22:42:00Z
    6. 醇>

    你可以简单地使用它:

     
    print 'something',
    ...
    print ' else',
    

    ,输出将是

     
    something else
    

    import sys无需过度杀伤。最后注意逗号符号。

    Python 3 +  print("some string", end="");删除末尾的换行插入。阅读更多help(print);

        
    102
    2017-01-04 11:41:18Z
    1. 你应该指出逗号
      2013-07-24 10:25:57Z
    2. 注意使用此方法有两个空格
      2013-11-12 03:20:49Z
    3. 这是最简单,最有效的答案。
      2015-05-22 04:45:36Z
    4. 当print的参数在括号中时,这不起作用。这有效:< print“hello”,;打印( “你好”)GT;但这不起作用< print(“hello”,);打印( “你好”)GT;
      2015-11-27 07:46:17Z
    5. print函数在python 2 VS 3中的语法略有不同。
      2016-02-07 04:24:41Z
    6. 醇>

    使用sys.stdout.write('Installing XXX... ')sys.stdout.write('Done')。这样,如果要重新创建打印功能,则必须手动添加新行"\n"。我认为可能没有必要为此使用curses。

        
    43
    2013-01-31 14:27:52Z
    1. 谢谢!这很好。
      2011-04-08 16:50:13Z
    2. 我个人更喜欢这个解决方案更高的投票,因为它在python2.x和python3.x上的工作方式完全相同,而不需要依赖__future__导入或类似的东西这一点。
      2013-01-31 14:29:04Z
    3. 醇>

    您应该使用退格键' \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%
    

    在这种情况下有关冲洗的其他信息:为什么包含'end ='参数的python print语句在while循环中表现不同?

        
    43
    2019-04-10 09:28:33Z
    1. 为了澄清,这个示例中的注释掉的代码看起来像是用于Python 2,而未注释的行用于Python 3。
      2015-03-09 23:05:11Z
    2. bouth行在Python 3中运行正常。如果使用'\x08'作为退格键,则需要刷新输出流 - print((b'\x08' * n).decode(),end ='',flush = True)
      2015-03-10 09:43:50Z
    3. 在linux上没有机会使用python 2.7。 :(
      2015-11-05 13:08:24Z
    4. 回车'\r'返回到行的开头,所以'* n'是不必要的
      2017-05-08 08:02:57Z
    5. @ bjnortier,对,更正
      2017-07-23 08:33:20Z
    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')
    

    “你好”将首先打印出来并在睡眠前冲到屏幕上。之后你可以使用标准prINT。

        
    16
    2013-07-22 18:23:47Z
    1. 谢谢!正是我需要的还有.flush()
      2016-10-20 12:28:43Z
    2. 醇>

    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

        
    14
    2011-04-08 16:43:15Z

    这个简单的例子将在同一行打印1-10。

     
    for i in range(1,11):
        print (i, end=" ")
    
        
    8
    2018-05-15 07:01:29Z

    Print有一个可选的结束参数,它是最后打印的。 默认值为换行符,但您可以将其更改为空字符串。例如:print(“hello world!”,end =“”)

        
    7
    2015-02-27 16:44:45Z
    1. 它给出了语法错误
      2015-07-13 14:37:03Z
    2. 这是在python 3中。在python 2中你只需print 'something',。最后的逗号可以防止添加换行符。
      2015-09-06 05:37:01Z
    3. 醇>

    最简单:

    Python 3

     
        print(‘\r’+’something to be override’,end=‘’)
    

    这意味着它会将光标返回到开头,而不是打印某些内容并以同一行结束。如果在循环中它将在它开始的相同位置开始打印。

        
    6
    2019-01-03 15:53:41Z
    1. 酷!也适用于Windows。
      2019-02-13 11:59:33Z
    2. 谢谢这个对我有用!我认为print(’something to be override’, end=‘\r’)更简单。
      2019-04-10 09:00:36Z
    3. 醇>

    如果要覆盖上一行(而不是不断添加),可以在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%"),
    
        
    4
    2015-10-09 17:50:09Z

    这是一个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解决方案看起来有点臃肿。例如,退格方法不使用整数参数和could可能完全被废除。

    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
    

    两者都经过测试和工作。

        
    3
    2018-01-10 19:47:22Z

    这是一个非常古老的主题,但这里有一个非常彻底的答案和示例代码。

    \r是ASCII字符集中回车符的字符串表示形式。它与八进制015 [chr(0o15)]或十六进制0d [chr(0x0d)]或十进制13 [chr(13)]相同。有关无聊的阅读,请参阅man ascii。它(\r)是一个非常便携的表示,很容易让人们阅读。它非常简单地意味着在不推进纸张的情况下将打印机上的托架一直移回到起点。它是CRCRLF部分,意思是回车和换行

    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()
    
        
    2
    2017-10-25 18:20:33Z
    1. 我认为你的答案更适合: stackoverflow.com/questions/45263205 /...
      2017-10-25 19:06:48Z
    2. 醇>

    如果您已将值预先存储在数组中,可以使用以下格式调用它们:

     
    for i in range(0,n):
           print arr[i],
    
        
    1
    2016-10-16 23:20:05Z

    我找到了这个解决方案,它正在使用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
    
        
    - 3
    2017-07-23 08:34:03Z
    1. print是Python 2.7的错误语法,即使语法正确,代码也不起作用。
      2017-08-06 20:47:24Z
    2. 醇>
来源放置 这里