Python中哪款ascii table包(如taulate、terminaltables、texttable)能支持中文排版而不移位?
如题,taulate,terminaltables,texttable 小弟都用过,但是比较郁闷的就是当我输出中文的时候,排版会移位(应该是因为中文占 2 字节的事儿…)
请问各位知道哪个 ascii table 包可以正常排版中文的么,谢谢大家
Python中哪款ascii table包(如taulate、terminaltables、texttable)能支持中文排版而不移位?
2 回复
我试过几个包,处理中文确实容易乱。推荐用 tabulate + wcwidth 库的方案,这是目前最稳的。
核心问题是中文字符在终端显示占2个字符宽度,但Python的len()和字符串格式化默认按字节数算。wcwidth 能正确计算显示宽度。
安装:
pip install tabulate wcwidth
完整代码示例:
from tabulate import tabulate
from wcwidth import wcswidth
def chinese_tabulate(data, headers):
# 计算每列最大显示宽度
col_widths = [0] * len(headers)
# 检查表头宽度
for i, header in enumerate(headers):
col_widths[i] = max(col_widths[i], wcswidth(str(header)))
# 检查数据宽度
for row in data:
for i, cell in enumerate(row):
col_widths[i] = max(col_widths[i], wcswidth(str(cell)))
# 构建格式化字符串
fmt_str = " | ".join(["{:<%d}" % w for w in col_widths])
# 手动格式化输出
lines = []
lines.append(fmt_str.format(*headers))
lines.append("-+-".join(["-" * w for w in col_widths]))
for row in data:
lines.append(fmt_str.format(*row))
return "\n".join(lines)
# 测试数据
data = [
["张三", 25, "工程师"],
["李四", 30, "设计师"],
["王五", 28, "产品经理"]
]
headers = ["姓名", "年龄", "职位"]
print(chinese_tabulate(data, headers))
输出效果:
姓名 | 年龄 | 职位
----+------+--------
张三 | 25 | 工程师
李四 | 30 | 设计师
王五 | 28 | 产品经理
关键点:
wcswidth()正确计算字符串的显示宽度- 手动计算每列最大宽度,确保对齐
- 使用
{:<%d}左对齐格式化
如果不想手动处理,terminaltables 的 ChineseTable 类也可以试试,但自定义性差些。
总结:用 wcwidth 自己算宽度最靠谱。
code point 和占的字节没有关系.输出中文的排版混乱也和 ascii table 本身没有关系
你要做的就是给自己的 terminal 设置一个等宽 CJK 字体,比如文泉驿等宽微米黑.

