本文目录导读:

要让脚本输出清晰美观,关键在于结构化、视觉层次、信息密度控制和颜色,以下是几种实用方法,从简单到专业,适用于不同场景(终端、日志、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),如果必须纯文本,则严格使用固定宽度和分隔线。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播