每次在终端打印表格、对齐日志、或者格式化金额,你是不是还在用字符串拼接和 ljust() 硬凑?Python 的格式迷你语言(format mini-language)是一套藏在 f-string 和 format() 背后的精简语法,专门解决"文本怎么摆、数字怎么显"的问题。掌握它,一行格式说明符就能替代多行手工对齐代码。
对齐与宽度:把文本摆整齐
格式说明符的基本结构是 [fill][align][width],其中:
- fill:填充字符,默认空格,可以是任意单字符
- align:
<左对齐、>右对齐、^居中,数字默认>,字符串默认< - width:最小字段宽度
name = "Alice"
score = 97
# 字符串默认左对齐,数字默认右对齐——混在一起就歪了
print(f"{name} {score}") # Alice 97 —— 看不出列边界
# 显式指定宽度和对齐,立刻整齐
print(f"{name:<10} {score:>5}") # Alice____ _____97
用非空格字符填充能让视觉分隔更清晰:
for label in ["CPU", "MEM", "DISK"]:
print(f"{label:^8}") # 居中,宽度 8
# __CPU___
# __MEM___
# _DISK__
= 是数字专用的对齐方式——符号居左、数字居右,中间填充,做财务报表时特别好用:
balance = -1234.56
print(f"{balance:=10}") # -___1234.56
精度与类型:让数字说人话
数字格式说明符的结构是 [width][.precision][type],常用 type:
| type | 含义 | 示例 |
|---|---|---|
d |
十进制整数 | 42 |
f |
定点小数 | 3.14 |
e |
科学计数法 | 3.14e+00 |
% |
百分比 | 3.14% |
, |
千分位分隔 | 1,234 |
精度 .precision 对浮点数控制小数位数,对字符串控制截断长度:
ratio = 0.8371
print(f"{ratio:.2f}") # 0.84 —— 保留两位小数,自动四舍五入
print(f"{ratio:.1%}") # 83.7% —— 百分比 + 一位小数
big = 123456789
print(f"{big:,d}") # 123,456,789 —— 千分位逗号
title = "A very long headline"
print(f"{title:.10}") # A very lon —— 字符串截断到 10 字符
千分位逗号和精度可以叠加:
revenue = 9876543.21
print(f"{revenue:,.2f}") # 9,876,543.21
组合实战:终端表格与日志对齐
把对齐、宽度、精度组合起来,就能用几行代码打印出专业级终端表格:
data = [
("Redis", 0.003, 128, 99.7),
("MySQL", 0.12, 512, 95.2),
("Kafka", 0.45, 256, 88.1),
]
# 表头
print(f"{'Service':<10} {'Latency':>8} {'Memory(MB)':>12} {'Uptime':>8}")
print("-" * 42)
# 数据行
for name, lat, mem, up in data:
print(f"{name:<10} {lat:>8.3f} {mem:>12,d} {up:>7.1f}%")
输出:
Service Latency Memory(MB) Uptime
------------------------------------------
Redis 0.003 128 99.7%
MySQL 0.120 512 95.2%
Kafka 0.450 256 88.1%
日志场景同样受益——固定宽度让时间戳和级别始终对齐:
import datetime
level = "WARN"
msg = "Connection pool exhausted"
now = datetime.datetime.now()
print(f"{now:%Y-%m-%d %H:%M:%S} | {level:^6} | {msg}")
# 2025-07-11 14:32:07 | _WARN_ | Connection pool exhausted
注意 now:%Y-%m-%d %H:%M:%S——datetime 对象也走格式迷你语言,%Y 等是 datetime 专用的格式码,和字符串/数字的说明符属于同一套语法体系。
动态宽度与嵌套变量
宽度和小数位数不必写死——可以用嵌套的 {} 从变量读取:
width = 12
precision = 4
value = 3.14159265
print(f"{value:{width}.{precision}f}") # ____3.1416
这在生成自适应宽度的报表时很实用:根据最长标签动态计算列宽,再传入格式说明符。
什么时候该换别的方案
格式迷你语言适合终端输出、日志、简单报表。如果遇到以下场景,考虑替代方案:
- 复杂表格:用
rich或tabulate库,自动处理跨列、颜色、边框。 - 模板邮件/HTML:用 Jinja2 等模板引擎,不要在 f-string 里堆 HTML。
- 大量重复格式:定义
FORMAT_PRICE = ",.2f"常量复用,避免每行重写说明符。
最后给一个速查清单,下次写格式说明符时对照即可:
- 字符串对齐:
<10左对齐宽 10、>10右对齐、^10居中 - 数字对齐:
>8右对齐宽 8、=10符号居左数字居右 - 精度:
.2f两位小数、.1%百分比一位小数、.10字符截断 - 分隔:
,d千分位整数、,.2f千分位 + 两位小数 - 动态:
{width}嵌套变量控制宽度
一行 f"{value:spec}" 能做的事,别再用三行字符串拼接了。