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
相关产品推荐
相关产品推荐

