Python实现类Linux top/htop的无闪烁JSON数据控制台动态展示
解决JSON数据控制台实时刷新无闪烁的表格视图问题
核心问题原因
你之前用os.system("clear")导致屏幕闪烁,本质是清屏后需要重新绘制所有内容,视觉上会出现明显的闪烁感。替代方案是利用ANSI终端控制序列,将光标移回终端顶部直接覆盖原有内容,而非清空整个屏幕。
解决方案实现
我们可以用\033[H将光标定位到终端左上角,配合\033[J清除光标到屏幕底部的内容(确保旧内容被完全覆盖),再结合表格生成工具输出规范格式,避免手动拼接字符串的繁琐。
步骤1:安装依赖(可选但推荐)
如果用tabulate生成标准表格,先安装依赖:
pip install tabulate pandas
步骤2:完整代码示例
import json import time import pandas as pd from tabulate import tabulate fn = "your_data.json" # 替换为你的JSON文件路径 first_run = True while True: try: # 读取JSON数据 with open(fn) as f: data = json.load(f) vs_df = pd.DataFrame({"name": data[0], "value": data[1]}) # 按每行4个变量分组 max_cols = 4 name_groups = [vs_df["name"].iloc[i:i+max_cols].tolist() for i in range(0, len(vs_df), max_cols)] value_groups = [vs_df["value"].iloc[i:i+max_cols].tolist() for i in range(0, len(vs_df), max_cols)] # 准备表格数据:名称行和值行交替 table_data = [] for names, values in zip(name_groups, value_groups): table_data.append(names) table_data.append(values) # 控制终端光标,避免闪烁 if not first_run: # 将光标移到左上角,并清除下方内容 print("\033[H\033[J", end="") first_run = False # 打印格式化表格 print(tabulate(table_data, tablefmt="pipe", numalign="center")) time.sleep(0.5) except json.decoder.JSONDecodeError: # JSON文件正在写入时可能解码失败,跳过重试 time.sleep(0.1) continue
关键细节说明
- ANSI控制序列:
\033[H把光标移动到终端左上角(行1列1),\033[J清除从光标位置到屏幕末尾的所有内容,新表格会直接覆盖旧内容,彻底消除清屏闪烁。 - 表格生成:
tabulate的pipe格式可生成你需要的Markdown风格表格,自动对齐内容,比手动拼接更整洁。 - 首次运行处理:第一次打印时不需要移动光标,避免终端内容乱跳。
无额外依赖的替代方案(不用tabulate)
如果不想安装外部库,可手动生成表格行:
# 替换代码中的表格打印部分 for names, values in zip(name_groups, value_groups): # 生成名称行(左对齐) name_line = "| " + " | ".join(f"{name:<10}" for name in names) + " |" print(name_line) # 生成值行(居中对齐) value_line = "| " + " | ".join(f"{val:^10}" for val in values) + " |" print(value_line)
内容的提问来源于stack exchange,提问作者Robert Syrnicki
相关产品推荐
相关产品推荐

