打印到同一行,而不是python中的新行

chr*_*ley 63 python stdout

基本上我想做与这个家伙做的相反的事情......呵呵.

Python脚本:每次打印新行到shell而不是更新现有行

我有一个程序告诉我它有多远.

for i in some_list:
    #do a bunch of stuff.
    print i/len(some_list)*100," percent complete"
Run Code Online (Sandbox Code Playgroud)

因此,如果len(some_list)为50,我会将最后一行打印50次.我想打印一行并不断更新该行.我知道我知道这可能是你整天都会读到的最蹩脚的问题.我只是无法弄清楚我需要在谷歌中找到答案的四个字.

更新!我试过mvds的建议哪个看起来没错.新代码

print percent_complete,"           \r",
Run Code Online (Sandbox Code Playgroud)

完成百分比只是一个字符串(我现在第一次抽象,我试图成为文字).现在的结果是它运行程序,直到程序结束后才打印ANYTHING,然后在一行且只有一行打印"100%完成".

如果没有回车(但是使用逗号,mvds的一半建议),它将一直打印到最后.然后打印:

0 percent complete     2 percent complete     3 percent complete     4 percent complete    
Run Code Online (Sandbox Code Playgroud)

等等.所以现在新的问题是用逗号它不会打印直到程序完成.

使用回车并且没有逗号,它的行为与两者都不完全相同.

mvd*_*vds 76

它被称为回车,或 \r

使用

print i/len(some_list)*100," percent complete         \r",
Run Code Online (Sandbox Code Playgroud)

逗号可防止print添加换行符.(并且空格将保持线路与先前输出清晰)

另外,不要忘记以print ""a结束至少获得最终的换行符!

  • 只需确保您始终打印相同数量的数据(或比之前的任何打印更多),否则最终会结束. (10认同)
  • @dustynachos:嘿,忘了皱纹.请参阅Python输出缓冲问题:http://stackoverflow.com/questions/107705/python-output-buffering (2认同)
  • 这对我不起作用。我实际上已经尝试了很多次,但它从来没有对我有用。我在 mac 上使用 iterm2,但大部分时间我都是通过 ssh 连接到 linux 服务器的。我从来没有找到一种真正有效的方法来做到这一点。 (2认同)

Rem*_*emi 27

从python 3.x你可以做到:

print('bla bla', end='')
Run Code Online (Sandbox Code Playgroud)

(通过放在from __future__ import print_function脚本/模块的顶部,也可以在Python 2.6或2.7中使用)

Python控制台进度条示例:

import time

# status generator
def range_with_status(total):
    """ iterate from 0 to total and show progress in console """
    n=0
    while n<total:
        done = '#'*(n+1)
        todo = '-'*(total-n-1)
        s = '<{0}>'.format(done+todo)
        if not todo:
            s+='\n'        
        if n>0:
            s = '\r'+s
        print(s, end='')
        yield n
        n+=1

# example for use of status generator
for i in range_with_status(10):
    time.sleep(0.1)
Run Code Online (Sandbox Code Playgroud)

  • 这摆脱了换行符,但不允许覆盖,我认为这是作者想要的。 (3认同)

dlc*_*ers 23

对我来说,有效的是Remi和siriusd的答案​​的组合:

from __future__ import print_function
import sys

print(str, end='\r')
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)


小智 12

对于您可能需要的控制台

sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

强制更新.我认为,在print中使用会阻止stdout冲洗,不知何故它不会更新


Leo*_*ark 7

没有人提到在Python 3.3+中您不需要sys.stdout.flush()print('foobar', end='', flush=True)作品。

  • 只要打印的文本以“\r”结尾,它就可以工作。 (2认同)

rro*_*ger 7

截至 2020 年底,Linux 控制台上的 Python 3.8.5 对我来说只有这个有效:

print('some string', end='\r')

信用转到:这篇文章


Ste*_*veJ 6

游戏迟到了 - 但是由于没有一个答案对我有用(我没有全部尝试)并且我在搜索中不止一次遇到这个答案......在python 3中,这个解决方案非常优雅我相信这正是作者正在寻找的,它更新了同一行上的单个语句。请注意,如果行缩小而不是增长,您可能需要做一些特殊的事情(例如可能使字符串固定长度并在末尾填充空格)

if __name__ == '__main__':
    for i in range(100):
        print("", end=f"\rPercentComplete: {i} %")
        time.sleep(0.2)
Run Code Online (Sandbox Code Playgroud)

  • python 最简单、最干净的选项 =&gt; 3.6 (2认同)