如何实现多行CPU使用率数据在控制台固定位置刷新显示?
问题
我正在编写Python程序,通过PSUtil获取并解析各核心的CPU使用率并展示给用户。当前代码运行时会不断追加新的输出行,而我希望在控制台同一位置刷新替换原有数据,同时保留每行的换行格式。
当前代码
import psutil import time def getAllCoreData_Parsed(): output = "" for count, cpu in enumerate(psutil.cpu_percent(percpu=True)): output += f"Core {count:<2}\t{cpu:>5}%\033[0;37;48m\n" return output while True: print( getAllCoreData_Parsed(), end="\r" ) time.sleep(1) print( "\x1b[K", end="\r" )
当前现象
输出会不断追加新的CPU数据行,示例如下:
Core 0 0.0% Core 1 0.0% ... Core 11 0.0% Core 0 5.0% Core 1 0.6% ... Core 11 0.0%
期望效果
在控制台同一位置刷新替换原有数据,每次只显示最新的各核心CPU使用率,示例如下:
Core 0 1.0% ... Core 11 0.0% (刷新后同一位置) Core 0 12.0% ... Core 11 0.0%
解决方案
要实现控制台同一位置刷新多行数据,核心是用ANSI控制码将光标移回数据起始位置,让新输出覆盖旧内容。修改后的代码如下:
import psutil import time def getAllCoreData_Parsed(): output = "" # 先调用一次避免首次返回0(psutil特性) psutil.cpu_percent(percpu=True) time.sleep(0.1) cpu_data_list = psutil.cpu_percent(percpu=True) core_count = len(cpu_data_list) for count, cpu in enumerate(cpu_data_list): output += f"Core {count:<2}\t{cpu:>5}%\n" return output, core_count while True: cpu_output, core_num = getAllCoreData_Parsed() print(cpu_output, end="") # ANSI控制码:光标向上移动core_num行,回到输出起始位置 print(f"\x1b[{core_num}A", end="") time.sleep(1)
代码说明
- 修正psutil首次调用问题:
psutil.cpu_percent(percpu=True)第一次调用会返回0值,所以先调用一次并短暂休眠,确保后续拿到真实的CPU使用率。 - 光标回移控制:
\x1b[{core_num}A是ANSI终端控制码,能让光标向上移动对应核心数的行数,回到输出内容的开头,下次打印就会直接覆盖旧数据。 - 简化冗余控制码:原代码里的
\033[0;37;48m是默认前景色设置,无实际作用,直接移除。
如果你的终端不支持ANSI控制码(比如Windows原生CMD),可以改用清屏方式实现:
import psutil import time import os def getAllCoreData_Parsed(): output = "" psutil.cpu_percent(percpu=True) time.sleep(0.1) for count, cpu in enumerate(psutil.cpu_percent(percpu=True)): output += f"Core {count:<2}\t{cpu:>5}%\n" return output while True: os.system('cls') # Linux/macOS替换成'clear' print(getAllCoreData_Parsed()) time.sleep(1)
内容的提问来源于stack exchange,提问作者Bingus
相关产品推荐
相关产品推荐

