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   | 产品经理

关键点:

  1. wcswidth() 正确计算字符串的显示宽度
  2. 手动计算每列最大宽度,确保对齐
  3. 使用 {:<%d} 左对齐格式化

如果不想手动处理,terminaltablesChineseTable 类也可以试试,但自定义性差些。

总结:用 wcwidth 自己算宽度最靠谱。


code point 和占的字节没有关系.输出中文的排版混乱也和 ascii table 本身没有关系

你要做的就是给自己的 terminal 设置一个等宽 CJK 字体,比如文泉驿等宽微米黑.

回到顶部