本文目录导读:

要让脚本输出清晰美观,关键在于结构化、视觉层次、信息密度控制和颜色,以下是几种实用方法,从简单到专业,适用于不同场景(终端、日志、Web等)。
核心原则:结构化与对齐
- 使用表格或固定宽度:让同类数据对齐。
- 添加分隔线:明确区分不同功能块。
- 控制长度:避免单行过长,注意换行。
具体实现方法(按终端工具分)
纯文本 + 字符串格式化(最通用)
利用 printf 或 format 来实现对齐。
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
避坑指南(常见问题)
- 避免滥用颜色:颜色太多会眼花缭乱,建议只用于状态(成功/失败/警告)和关键数据(如百分比临界值)。
- 处理中文字符对齐:中文字符宽度可能不一致,建议使用固定宽度(如
<20)或wcwidth库计算。 - 支持无终端环境:如果脚本输出可能被重定向到文件或管道,检查
isatty(),在非终端时移除颜色。 - 保持简洁:美观不等于信息量爆棚,学会使用
less或more进行分页显示。
总结表
| 场景 | 推荐工具/方法 | 复杂度 | 美观度 |
|---|---|---|---|
| 简单对齐 | 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),如果必须纯文本,则严格使用固定宽度和分隔线。