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

Python如何实现类似TQDM仅清除上方单行而非整清控制台的功能

实现方案

核心基于ANSI转义序列实现单/多行内容定向清除,无需依赖任何第三方库,兼容绝大多数主流终端环境。

用到的核心控制指令:

  • \r:光标移动到当前行首
  • \033[nA:光标向上移动n行
  • \033[K:清除光标所在位置到行尾的内容

执行逻辑

  1. 程序启动后先打印顶部固定的两行内容,该内容后续不会被修改
  2. 所有动态更新的内容全部在固定内容下方输出,更新时仅需要将光标移动到动态内容的起始位置,清空原有内容后打印新内容即可,不会影响上方固定行
完整可运行代码
import sys
import time
import random

# 兼容Windows旧版本系统开启虚拟终端支持(Win10 1511及以上版本可省略)
if sys.platform == 'win32':
    import ctypes
    kernel32 = ctypes.windll.kernel32
    kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7)

# 仅打印一次顶部固定内容
print("Modeni")
print("Thank You")

xLoad = False
_RAND_ = random.randint

# 模拟启动加载逻辑
while not xLoad:
    # 打字机效果的加载提示
    string1 = ' Loading Prerequisites. . . '
    for letter in string1:
        time.sleep(0.01)
        sys.stdout.write(letter)
        sys.stdout.flush()
    sys.stdout.write('\n')
    sys.stdout.flush()

    # 自定义进度条替代tqdm
    total = _RAND_(800, 1999)
    for i in range(total):
        time.sleep(0.0001)
        # 计算进度条样式
        progress = (i + 1) / total
        bar_len = 30
        filled_len = int(bar_len * progress)
        bar = '=' * filled_len + '-' * (bar_len - filled_len)
        # 动态更新当前行进度
        sys.stdout.write(f'\r[{bar}] {progress:.1%}')
        sys.stdout.flush()
    xLoad = True

# 加载完成后清空进度行,打印完成提示
sys.stdout.write('\r\033[K加载完成\n')
sys.stdout.flush()

time.sleep(3)
补充说明

如果需要更新多行动态内容,仅需要在更新前通过\033[nA将光标上移对应行数,再逐行清空打印即可,例如需要更新3行动态内容时,先执行sys.stdout.write('\033[3A')即可将光标定位到3行上方的动态内容起始位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:06:11