You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双循环进度显示场景下,如何用\r回到行首并清除整行内容?

问题:两层循环进度条的行清除问题

我想用以下代码,通过外循环的迭代数字和内循环的圆点展示两层循环的进度:

import time
def foo():
    for j in range(0,100):
        if j % 10 == 0:
            print('.', end='', flush=True, sep='')
            time.sleep(0.2)

for i in range(0,100):
    if i % 10 == 0:
        print('\r', i, end='', flush=True, sep='')
        time.sleep(1)
    foo()

但当i==10时,虽然\r能回到行首,却无法清除之前的圆点,只能覆盖原有内容(行尾的圆点不会被清除,导致数字后面残留多余圆点)。请问是否有办法通过\r实现清除整行并回到行首?


解决方法

\r本身仅能将光标移至行首,不会主动清除已有内容。要实现整行清除,可以通过以下两种方式:

方案1:用空格覆盖原有内容

在输出新数字前,先输出足够数量的空格,覆盖掉之前行内的所有内容,再回到行首输出新内容:

import time

def foo():
    for j in range(0, 100):
        if j % 10 == 0:
            print('.', end='', flush=True)
            time.sleep(0.2)

for i in range(0, 100):
    if i % 10 == 0:
        # 输出空格覆盖整行内容,再回到行首
        print('\r' + ' ' * 50, end='', flush=True)
        print('\r', i, end='', flush=True)
        time.sleep(1)
    foo()

注:50是预估的最大行长度,可根据实际输出情况调整数值,确保能覆盖所有原有内容。

方案2:使用ANSI终端控制字符清除行尾

多数终端支持ANSI转义序列\033[K,它会清除从当前光标位置到行尾的所有字符。结合\r回到行首后使用该序列,即可彻底清除整行:

import time

def foo():
    for j in range(0, 100):
        if j % 10 == 0:
            print('.', end='', flush=True)
            time.sleep(0.2)

for i in range(0, 100):
    if i % 10 == 0:
        # 回到行首,清除行尾内容,再输出数字
        print('\r\033[K', i, end='', flush=True)
        time.sleep(1)
    foo()

内容的提问来源于stack exchange,提问作者mahmood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:05:17