Python技术迷

如何使用 Python 输出漂亮的表格?

我昨晚加班到挺晚的,回家在电脑前随手写了点小工具,顺便想着跟你们聊聊一个看似简单但经常有人问的问题:怎么用 Python 打印出一个好看的表格?你可能觉得这事儿小菜一碟,但真到线上或者文档里展示的时候,排版丑得要命,别人一眼就能看出来你没花心思。今天我就结合自己用过的一些库,带点代码,给你们整一个“从朴素到漂亮”的表格输出进化史。

最原始的办法:print 拼接

我最早写脚本那会儿,都是直接 print 输出,手动拼接空格对齐,效率低得要死。比如这样:

data = [
    ["姓名", "年龄", "城市"],
    ["小李", 25, "北京"],
    ["小王", 30, "上海"],
    ["小张", 28, "深圳"]
]

for row in data:
    print("  ".join(str(x) for x in row))

看着好像没问题,但数字多一点就乱了套,表格对齐全靠肉眼调整空格,不可能长久。

format 的小技巧

后来我学会了用 str.format,可以控制宽度,至少不会乱七八糟。

for row in data:
    print("{:<6}{:<4}{:<6}".format(*row))

效果比直接拼凑好多了,但问题是:你要手动数宽度,字段一变还得改,麻烦。

tabulate:快速上手的神器

等我真正需要写点对外展示的脚本时,发现了 tabulate,直接救命。

from tabulate import tabulate

print(tabulate(data[1:], headers=data[0], tablefmt="grid"))

输出就变成了:

+------+----+------+
| 姓名 | 年龄 | 城市 |
+------+----+------+
| 小李 |  25 | 北京 |
| 小王 |  30 | 上海 |
| 小张 |  28 | 深圳 |
+------+----+------+

这就已经能拿去写文档了,还能换样式,比如 plain、fancy_grid、github,随便切。

PrettyTable:更灵活

再后来我写过一个 CLI 工具,需要交互式打印表格,tabulate 不太够用,于是用 PrettyTable。

from prettytable import PrettyTable

table = PrettyTable()
table.field_names = ["姓名", "年龄", "城市"]

for row in data[1:]:
    table.add_row(row)

print(table)

它支持对齐方式、边框样式、列宽限制,甚至还能直接导出成 HTML,这在生成报告时特别好用。

pandas:数据处理 + 表格展示

如果你已经用 pandas,那就更简单了,DataFrame 自带的 to_string 方法就很整齐。

import pandas as pd

df = pd.DataFrame(data[1:], columns=data[0])
print(df.to_string(index=False))

输出简洁明了,最重要的是你还能直接处理数据,比如排序、分组,再一键输出。

rich:终端里的艺术品

后来我发现 rich,它几乎是终端美化的全家桶。打印表格只是小功能,但效果非常炫。

from rich.table import Table
from rich.console import Console

table = Table(title="人员信息")

table.add_column("姓名", justify="center", style="cyan")
table.add_column("年龄", justify="right", style="magenta")
table.add_column("城市", justify="center", style="green")

for row in data[1:]:
    table.add_row(*map(str, row))

console = Console()
console.print(table)

终端输出就是彩色表格,还能加边框、标题、甚至嵌套,做 CLI 工具的时候特别加分。

自己写个小封装

最后,我想说其实很多时候不需要装大而全的库,你完全可以封装一个简单的函数,自己用足够了。比如根据列宽自动调整:

defprint_table(rows):
    col_widths = [max(len(str(x)) for x in col) for col in zip(*rows)]
for row in rows:
        print(" | ".join(str(x).ljust(w) for x, w in zip(row, col_widths)))

print_table(data)

这算不上花哨,但稳定,适合那种临时脚本。

写到这儿,差不多把常见方案都过了一遍。从最原始的 print,到 rich 的高颜值,基本能覆盖不同场景:临时脚本就随便拼,写文档推荐 tabulate,工具类项目用 rich,数据分析直接 pandas,想省事儿就 PrettyTable。反正一句话:别再用手动空格凑表格了,真的丑。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领