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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 01:37:26