如何用tabulate逐行打印DataFrame且仅首行带表头?
用tabulate实现带表头的逐行写入(保持列宽一致)
要实现仅首次打印表头、后续行保持相同列宽的需求,你可以通过提取表头的列宽参数,在后续打印单行时复用该参数来保证格式统一。以下是具体实现:
修正后的代码
import pandas as pd from tabulate import tabulate # 假设你的transition_df和states已定义 with open('texttest.txt', 'w') as f: # 处理第一行:生成带表头的完整表格并提取格式信息 first_row = transition_df.iloc[[0]] full_table = tabulate(first_row, headers='keys', tablefmt='psql', showindex=False) table_lines = full_table.split('\n') # 提取表格的结构元素:顶部分隔线、表头、表头分隔线、第一数据行、底部分隔线 top_separator = table_lines[0] header = table_lines[1] header_separator = table_lines[2] first_data_line = table_lines[3] bottom_separator = table_lines[4] # 写入第一部分(表头+第一行数据) f.write('\n'.join([top_separator, header, header_separator, first_data_line, bottom_separator])) # 计算列宽:从表头分隔线中提取每列的宽度 col_widths = [len(seg.strip()) for seg in header_separator.strip('|').split('+')] # 处理后续行 for idx in range(1, len(states[:3])): current_row = transition_df.iloc[[idx]] # 用提取的列宽生成单行表格,保证列宽与表头一致 row_table = tabulate( current_row, headers=[], # 不显示表头 tablefmt='psql', showindex=False, colwidths=col_widths # 复用表头的列宽 ) row_lines = row_table.split('\n') # 写入当前行的分隔线和数据行 f.write('\n' + '\n'.join(row_lines))
关键逻辑说明
- 提取列宽:从第一次生成的表头分隔线(如
|---------+----------+...|)中拆分出每列的宽度,确保后续行的列宽与表头完全匹配。 - 复用格式参数:后续打印单行时,通过
colwidths参数传入提取的列宽,让tabulate生成与表头同宽度的表格行。 - 逐行写入控制:首次写入完整的表头结构,后续仅追加单行的表格内容,避免重复打印表头。
注意事项
- 原代码中每次循环都打印整个
transition_df,这会导致重复输出全表数据,修正后改为每次提取单行(iloc[[idx]])。 colwidths参数是tabulate控制列宽的核心,通过复用表头的列宽可以完美保持格式一致性。
内容的提问来源于stack exchange,提问作者Ernek
相关产品推荐
相关产品推荐

