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

Python如何打印适配终端尺寸的表格?长列表支持多列展示

Python实现横向多列表格打印方案

目前主流的表格打印库(比如tabulate、prettytable)默认没有直接支持横向重复表格以缩短纵向长度的功能,但可以通过基于现有库做二次处理,或者自行编写分栏逻辑来实现你的需求。

方案一:自行实现分栏打印逻辑

这种方式不需要依赖额外库,直接根据终端宽度自动分栏,代码示例如下:

import shutil
from math import ceil

def print_multi_column_table(headers, data, col_sep="      "):
    # 获取当前终端的宽度
    term_width = shutil.get_terminal_size().columns
    # 生成单栏的表头和分隔线
    header_line = " | ".join(headers)
    separator_line = "-+-".join(["-"*len(h) for h in headers])
    single_col_width = len(header_line)
    
    # 计算终端能容纳的最多表格栏数
    max_cols = max(1, term_width // (single_col_width + len(col_sep)))
    # 每栏需要容纳的行数
    rows_per_col = ceil(len(data) / max_cols)
    
    # 将数据拆分到多个栏中,不足的栏补空行对齐
    columns = []
    for i in range(max_cols):
        start = i * rows_per_col
        end = start + rows_per_col
        col_data = data[start:end]
        # 补空行匹配最长栏的行数
        while len(col_data) < rows_per_col:
            col_data.append(tuple(" " * len(h) for h in headers))
        columns.append(col_data)
    
    # 打印多栏表头
    print(col_sep.join([header_line] * max_cols))
    # 打印多栏分隔线
    print(col_sep.join([separator_line] * max_cols))
    # 逐行打印多栏内容
    for row_idx in range(rows_per_col):
        row_parts = []
        for col in columns:
            # 按表头宽度左对齐每一列内容
            row_line = " | ".join([str(item).ljust(len(header)) for item, header in zip(col[row_idx], headers)])
            row_parts.append(row_line)
        print(col_sep.join(row_parts))

# 测试用例
if __name__ == "__main__":
    headers = ["name", "score"]
    data = [
        ("Tim", 99), ("Ana", 80), ("Jim", 100), ("Tim", 100), ("Tom", 150),
        ("Lily", 100), ("Lucy", 120), ("Bob", 85), ("Alice", 92), ("David", 78),
        ("Emma", 95), ("Frank", 88), ("Grace", 100), ("Henry", 75), ("Ivy", 90)
    ]
    print_multi_column_table(headers, data)

方案二:结合tabulate库实现

如果你习惯用tabulate来处理表格格式,可以先用它生成单栏的文本行,再自行处理分栏拼接,示例代码:

import shutil
from math import ceil
from tabulate import tabulate

def print_multi_column_with_tabulate(headers, data, col_sep="      "):
    term_width = shutil.get_terminal_size().columns
    # 用tabulate生成单栏表格的所有文本行
    single_col_lines = tabulate(data, headers=headers, tablefmt="pipe").split("\n")
    single_col_width = len(single_col_lines[0])
    
    # 计算最多栏数
    max_cols = max(1, term_width // (single_col_width + len(col_sep)))
    if max_cols == 1:
        print("\n".join(single_col_lines))
        return
    
    # 提取单栏的数据行(去掉表头和分隔线)
    data_lines = single_col_lines[2:]
    rows_per_col = ceil(len(data_lines) / max_cols)
    
    # 拆分数据到多个栏,补空行对齐
    col_data_lines = []
    for i in range(max_cols):
        start = i * rows_per_col
        end = start + rows_per_col
        lines = data_lines[start:end]
        while len(lines) < rows_per_col:
            lines.append(" " * single_col_width)
        col_data_lines.append(lines)
    
    # 打印多栏表头和分隔线
    print(col_sep.join([single_col_lines[0]] * max_cols))
    print(col_sep.join([single_col_lines[1]] * max_cols))
    # 逐行拼接多栏内容
    for row_idx in range(rows_per_col):
        print(col_sep.join([col[row_idx] for col in col_data_lines]))

# 测试用例
if __name__ == "__main__":
    headers = ["name", "score"]
    data = [
        ("Tim", 99), ("Ana", 80), ("Jim", 100), ("Tim", 100), ("Tom", 150),
        ("Lily", 100), ("Lucy", 120), ("Bob", 85), ("Alice", 92), ("David", 78),
        ("Emma", 95), ("Frank", 88), ("Grace", 100), ("Henry", 75), ("Ivy", 90)
    ]
    print_multi_column_with_tabulate(headers, data)

以上两种方案都会根据终端宽度自动调整表格栏数,实现你想要的横向重复表格效果,你可以根据自己的需求选择或修改代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:14:57