python2.7 print函数中\r的作用

这是搜索到的一段progress bar的代码:

from __future__ import print_function
# Print iterations progress
def printProgressBar (iteration, total, prefix = '', suffix = '', decimals = 1, length = 100, fill = '|'):
    """
    Call in a loop to create terminal progress bar
    @params:
        iteration   - Required  : current iteration (Int)
        total       - Required  : total iterations (Int)
        prefix      - Optional  : prefix string (Str)
        suffix      - Optional  : suffix string (Str)
        decimals    - Optional  : positive number of decimals in percent complete (Int)
        length      - Optional  : character length of bar (Int)
        fill        - Optional  : bar fill character (Str)
    """
    percent = ("{0:." + str(decimals) + "f}").format(100 * (iteration / float(total)))
    filledLength = int(length * iteration // total)
    bar = fill * filledLength + '-' * (length - filledLength)
    print('\r%s |%s| %s%% %s' % (prefix, bar, percent, suffix), end = '\r')
    # Print New Line on Complete
    if iteration == total:
        print()
from time import sleep

# A List of Items
items = list(range(0, 57))
l = len(items)

# Initial call to print 0% progress
printProgressBar(0, l, prefix = 'Progress:', suffix = 'Complete', length = 50)

print('\r%s |%s| %s%% %s' % (prefix, bar, percent, suffix), end = '\r')

这里的 第一个 \r 起到了什么作用呢? 我知道这个是让光标回到行首 这个end='r'不是已经在每一行都做这个操作了吗?

另外:如果去掉第一个r 也能显示进度条 但是很不流畅,好像缓冲区没有在每一次print的时候清空,难道r还有清空缓冲区的作用?

阅读 7.1k
2 个回答

亲测没有任何作用。
想流畅,输出后应该用 sys.stdout.flush 清空缓冲区。

\r可以把缓冲区最后一行清掉。

你可以试试下面的代码,它展示了个小动画。

import sys
import time

symbols = ['\r|', '\r/', '\r-', '\r\\']

i = 0
while True:
    sys.stdout.write(symbols[i])
    sys.stdout.flush()
    time.sleep(0.5)
    i = (i + 1) % 4
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进