如何让PrettyTable的标题嵌入顶部分隔线而非单独占用一行
PrettyTable 标题嵌入顶部边框实现方案
原生PrettyTable没有内置标题嵌入顶部分隔线的能力,下面两种方案都支持动态适配表格宽度,不会出现错位问题:
方案1:继承PrettyTable类重写逻辑(推荐)
直接通过继承扩展原生类的边框生成逻辑,后续所有表格都可以复用这个自定义类,原有代码修改量极小:
from prettytable import PrettyTable class CustomTitlePrettyTable(PrettyTable): def _get_top_border(self): # 先获取无标题场景下的原生顶部边框 original_border = super()._get_top_border() if not self.title: return original_border # 计算边框总长度、标题占位长度 border_total_len = len(original_border) wrapped_title = f"({self.title})" title_len = len(wrapped_title) # 计算两侧填充的短横线数量,自动处理奇偶宽度 fill_total_len = border_total_len - 2 - title_len left_fill = fill_total_len // 2 right_fill = fill_total_len - left_fill # 拼接生成嵌标题的顶部边框 return f"+{'-'*left_fill}{wrapped_title}{'-'*right_fill}+"
使用时只需要把原代码里的PrettyTable替换为CustomTitlePrettyTable即可,其他逻辑完全不需要改动:
myTable = CustomTitlePrettyTable(["Student Name", "Class", "Section", "Percentage"]) myTable.title = 'Big Bang Theory' # 新增行逻辑和原生完全一致 myTable.add_row(["Leanord", "X", "B", "91.2 %"]) myTable.add_row(["Penny", "X", "C", "63.5 %"]) myTable.add_row(["Howard", "X", "A", "90.23 %"]) myTable.add_row(["Bernadette", "X", "D", "92.7 %"]) myTable.add_row(["Sheldon", "X", "A", "98.2 %"]) myTable.add_row(["Raj", "X", "B", "88.1 %"]) myTable.add_row(["Amy", "X", "B", "95.0 %"]) print(myTable)
方案2:动态字符串拼接(临时使用)
如果不想自定义类,也可以先获取无标题的表格内容,动态计算替换顶部边框,同样适配任意宽度:
from prettytable import PrettyTable # 原生初始化表格 myTable = PrettyTable(["Student Name", "Class", "Section", "Percentage"]) myTable.add_row(["Leanord", "X", "B", "91.2 %"]) myTable.add_row(["Penny", "X", "C", "63.5 %"]) myTable.add_row(["Howard", "X", "A", "90.23 %"]) myTable.add_row(["Bernadette", "X", "D", "92.7 %"]) myTable.add_row(["Sheldon", "X", "A", "98.2 %"]) myTable.add_row(["Raj", "X", "B", "88.1 %"]) myTable.add_row(["Amy", "X", "B", "95.0 %"]) # 生成不带标题的表格内容 raw_table = myTable.get_string() table_lines = raw_table.split("\n") origin_top_border = table_lines[0] # 动态计算嵌标题的顶部边框 title = "Big Bang Theory" wrapped_title = f"({title})" border_len = len(origin_top_border) fill_len = border_len - 2 - len(wrapped_title) left_fill = fill_len//2 right_fill = fill_len - left_fill new_top_border = f"+{'-'*left_fill}{wrapped_title}{'-'*right_fill}+" # 替换第一行输出 table_lines[0] = new_top_border print("\n".join(table_lines))
注意点
如果标题长度超过表格总宽度,可自行添加截断逻辑避免边框错位,比如将wrapped_title = f"({self.title})"修改为wrapped_title = f"({self.title[:border_total_len-4]})"即可自动截断过长的标题。
内容的提问来源于stack exchange,提问作者Slartibartfast
相关产品推荐
相关产品推荐

