Python 格式迷你语言:让字符串输出不再凌乱

2026-06-02 33 预计阅读时间:1 分钟
来源:realpython.com AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:6 分钟

每次在终端打印表格、对齐日志、或者格式化金额,你是不是还在用字符串拼接和 ljust() 硬凑?Python 的格式迷你语言(format mini-language)是一套藏在 f-stringformat() 背后的精简语法,专门解决"文本怎么摆、数字怎么显"的问题。掌握它,一行格式说明符就能替代多行手工对齐代码。

对齐与宽度:把文本摆整齐

格式说明符的基本结构是 [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

这在生成自适应宽度的报表时很实用:根据最长标签动态计算列宽,再传入格式说明符。

什么时候该换别的方案

格式迷你语言适合终端输出、日志、简单报表。如果遇到以下场景,考虑替代方案:

  • 复杂表格:用 richtabulate 库,自动处理跨列、颜色、边框。
  • 模板邮件/HTML:用 Jinja2 等模板引擎,不要在 f-string 里堆 HTML。
  • 大量重复格式:定义 FORMAT_PRICE = ",.2f" 常量复用,避免每行重写说明符。

最后给一个速查清单,下次写格式说明符时对照即可:

  • 字符串对齐:<10 左对齐宽 10、>10 右对齐、^10 居中
  • 数字对齐:>8 右对齐宽 8、=10 符号居左数字居右
  • 精度:.2f 两位小数、.1% 百分比一位小数、.10 字符截断
  • 分隔:,d 千分位整数、,.2f 千分位 + 两位小数
  • 动态:{width} 嵌套变量控制宽度

一行 f"{value:spec}" 能做的事,别再用三行字符串拼接了。


相关推荐