脚本输出格式化怎样做到清晰美观

wen 实用脚本 2

本文目录导读:

脚本输出格式化怎样做到清晰美观

  1. 核心原则:结构化与对齐
  2. 具体实现方法(按终端工具分)
  3. 特定场景优化
  4. 避坑指南(常见问题)
  5. 总结表

要让脚本输出清晰美观,关键在于结构化、视觉层次、信息密度控制颜色,以下是几种实用方法,从简单到专业,适用于不同场景(终端、日志、Web等)。

核心原则:结构化与对齐

  • 使用表格或固定宽度:让同类数据对齐。
  • 添加分隔线:明确区分不同功能块。
  • 控制长度:避免单行过长,注意换行。

具体实现方法(按终端工具分)

纯文本 + 字符串格式化(最通用)

利用 printfformat 来实现对齐。

Python 示例(使用 format 和制表符)

# 不美观的打印
data = [("Alice", 25, "Engineer"), ("Bob", 30, "Designer")]
for name, age, job in data:
    print(name, age, job)
# 输出:Alice 25 Engineer (不对齐)
# 美观的打印:固定宽度 + 右对齐
header = f"{'Name':<10} {'Age':<5} {'Job':<15}"
sep = "-" * 35
print(header)
print(sep)
for name, age, job in data:
    print(f"{name:<10} {age:>5} {job:<15}")
# 输出:
# Name       Age   Job
# -----------------------------------
# Alice       25   Engineer
# Bob         30   Designer

Bash 示例(使用 column 或 printf)

# 使用 column 命令自动对齐(需要输入以分隔符分割)
echo -e "Name,Age,Job\nAlice,25,Engineer\nBob,30,Designer" | column -t -s ','
# 输出:
# Name   Age  Job
# Alice  25   Engineer
# Bob    30   Designer

使用颜色(提升可读性)

终端大多数支持 ANSI 转义码。

Bash 颜色定义

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo -e "${GREEN}[OK]${NC} Operation successful."
echo -e "${RED}[ERR]${NC} File not found."
echo -e "${YELLOW}[WARN]${NC} Low disk space."

Python 颜色(使用 colorama 跨平台)

from colorama import Fore, Style, init
init(autoreset=True)
print(f"{Fore.GREEN}[OK]{Style.RESET_ALL} Operation successful.")
print(f"{Fore.RED}[ERR]{Style.RESET_ALL} File not found.")

使用专用库(最推荐)

Python:rich 库(强大且美观) 这是创建美观终端输出的利器,支持表格、Markdown、进度条、语法高亮等。

from rich.console import Console
from rich.table import Table
console = Console()
# 创建表格
table = Table(title="System Report")
table.add_column("Name", style="cyan", no_wrap=True)
table.add_column("Status", style="magenta")
table.add_column("Data", justify="right")
table.add_row("CPU", "OK", "45.2°C")
table.add_row("Memory", "WARNING", "87%")
table.add_row("Disk", "CRITICAL", "98%")
console.print(table)
# 带颜色的日志
console.log("[bold green]Task completed![/bold green]")

Bash:figlet + lolcat(花哨但低密度)或欢迎信息,不适合大量数据。

figlet "System Check" | lolcat
# 输出一个彩虹色的大字标题

特定场景优化

日志输出

  • 结构[时间戳] [级别] [模块] 消息
  • 级别:颜色区分(FATAL=红,ERROR=红,WARN=黄,INFO=绿/蓝,DEBUG=灰)
  • 行限制:每条日志占一行,避免换行混乱。

Python 例子(logging + colorlog)

import logging
import colorlog
handler = colorlog.StreamHandler()
handler.setFormatter(colorlog.ColoredFormatter(
    '%(log_color)s%(asctime)s [%(levelname)s] %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'))
logger = colorlog.getLogger()
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
logger.info("Server started")
logger.warning("Disk usage high")

进度条

  • Python:tqdm(极简)。
  • Bash:pv 或内置 progressive
from tqdm import tqdm
import time
for i in tqdm(range(100), desc="Loading data"):
    time.sleep(0.01)
# 输出一个动态的进度条,带百分比、耗时、速率

Web 输出(如 Flask/Api)

  • 格式:使用 JSON 并缩进。
  • 美观:在浏览器端用 Prism.js 或 Highlight.js 做语法高亮。
  • 表头:打印表格时确保宽度适配。

Flask 返回格式化 JSON

from flask import jsonify, make_response
@app.route('/data')
def get_data():
    data = {"name": "Alice", "scores": [90, 85, 92]}
    # 自动缩进
    response = make_response(jsonify(data), 200)
    response.headers['Content-Type'] = 'application/json; charset=utf-8'
    return response

避坑指南(常见问题)

  1. 避免滥用颜色:颜色太多会眼花缭乱,建议只用于状态(成功/失败/警告)关键数据(如百分比临界值)。
  2. 处理中文字符对齐:中文字符宽度可能不一致,建议使用固定宽度(如<20)或 wcwidth 库计算。
  3. 支持无终端环境:如果脚本输出可能被重定向到文件或管道,检查 isatty(),在非终端时移除颜色。
  4. 保持简洁:美观不等于信息量爆棚,学会使用 lessmore 进行分页显示。

总结表

场景 推荐工具/方法 复杂度 美观度
简单对齐 printf, column (Bash) / format (Python)
带颜色日志 colorlog (Python) / tput (Bash) 中高
专业终端 UI rich (Python) / gum (Bash)
动态进度条 tqdm (Python) / pv (Bash) 极低
Web API 输出 json.dumps(indent=2) 中高

最佳实践:对于大部分脚本,优先使用 rich(Python)或 printf + column(Bash),如果必须纯文本,则严格使用固定宽度分隔线

抱歉,评论功能暂时关闭!