You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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))

关键逻辑说明

  1. 提取列宽:从第一次生成的表头分隔线(如|---------+----------+...|)中拆分出每列的宽度,确保后续行的列宽与表头完全匹配。
  2. 复用格式参数:后续打印单行时,通过colwidths参数传入提取的列宽,让tabulate生成与表头同宽度的表格行。
  3. 逐行写入控制:首次写入完整的表头结构,后续仅追加单行的表格内容,避免重复打印表头。

注意事项

  • 原代码中每次循环都打印整个transition_df,这会导致重复输出全表数据,修正后改为每次提取单行(iloc[[idx]])。
  • colwidths参数是tabulate控制列宽的核心,通过复用表头的列宽可以完美保持格式一致性。

内容的提问来源于stack exchange,提问作者Ernek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 21:15:47