Python实现自适应或固定长度表格输出的技术咨询
实现Python自适应/固定长度表格输出的解决方案
嘿,这个问题我之前也碰到过——硬编码表格边框长度确实很容易在内容长度变化时翻车。好在Python里有不少办法能搞定自适应或者固定长度的表格输出,我给你两种实用方案:
一、自适应宽度表格(自动适配内容长度)
这个思路是先统计每一列内容的最大宽度,然后根据这个宽度动态生成边框和对齐内容,完全不用手动算长度。
示例代码
# 先把所有要展示的数据整理成结构化的列表 table_data = [ ["Total number of sentences:", nos, "Total number of sentences:", no], ["Total number of Vocabs in file 1:", nov, "Total number of Vocabs in file 2:", novv], ["The diff. in dict. is :", novcalc, "", ""], # 空内容占位 ["The number of words appearing less than 3 times in the first file are :", result, "", ""], ["The number of words appearing less than 3 times in the sec. file are :", resultt, "", ""] ] # 计算每一列的最大宽度(这里分4列:左描述、左数值、右描述、右数值) col_widths = [ max(len(str(row[0])) for row in table_data), max(len(str(row[1])) for row in table_data), max(len(str(row[2])) for row in table_data), max(len(str(row[3])) for row in table_data) ] # 定义边框线的生成函数 def generate_border(col_widths): # 每列左右加1个空格,边框用-,列之间用|分隔 border_parts = [f"-"*(width + 2) for width in col_widths] return f"|{'|'.join(border_parts)}|" # 打印顶部边框 print(generate_border(col_widths)) # 逐行打印内容 for row in table_data: # 每一项都左对齐,填充到对应列的宽度,左右加空格 formatted_row = [ f" {str(row[0]).ljust(col_widths[0])} ", f" {str(row[1]).ljust(col_widths[1])} ", f" {str(row[2]).ljust(col_widths[2])} ", f" {str(row[3]).ljust(col_widths[3])} " ] print(f"|{'|'.join(formatted_row)}|") # 每一行内容后打印分隔边框 print(generate_border(col_widths))
代码说明
- 先把所有要展示的内容整理成二维列表,方便统一处理;
- 通过遍历每一列的所有内容,计算出该列需要的最大宽度;
- 动态生成边框线,确保边框长度和内容宽度完全匹配;
- 用
ljust()方法把每一项内容左对齐填充到对应列的宽度,保证排版整齐。
二、固定宽度表格(预设列宽,统一排版)
如果希望表格有固定的宽度,不管内容长短都保持统一样式,可以直接用字符串格式化的固定宽度参数,超出部分可以选择截断或者换行。
示例代码
# 预设每一列的固定宽度(可以根据需求调整) LEFT_DESC_WIDTH = 50 LEFT_VAL_WIDTH = 15 RIGHT_DESC_WIDTH = 50 RIGHT_VAL_WIDTH = 15 # 定义边框线 border = f"|{'-'*(LEFT_DESC_WIDTH + 2)}|{'-'*(LEFT_VAL_WIDTH + 2)}|{'-'*(RIGHT_DESC_WIDTH + 2)}|{'-'*(RIGHT_VAL_WIDTH + 2)}|" # 打印顶部边框 print(border) # 第一行内容 print(f"| {'Total number of sentences:'.ljust(LEFT_DESC_WIDTH)} | {str(nos).ljust(LEFT_VAL_WIDTH)} | {'Total number of sentences:'.ljust(RIGHT_DESC_WIDTH)} | {str(no).ljust(RIGHT_VAL_WIDTH)} |") print(border) # 第二行内容 print(f"| {'Total number of Vocabs in file 1:'.ljust(LEFT_DESC_WIDTH)} | {str(nov).ljust(LEFT_VAL_WIDTH)} | {'Total number of Vocabs in file 2:'.ljust(RIGHT_DESC_WIDTH)} | {str(novv).ljust(RIGHT_VAL_WIDTH)} |") print(border) # 第三行内容(只有左列) print(f"| {'The diff. in dict. is :'.ljust(LEFT_DESC_WIDTH)} | {str(novcalc).ljust(LEFT_VAL_WIDTH)} | {' '.ljust(RIGHT_DESC_WIDTH)} | {' '.ljust(RIGHT_VAL_WIDTH)} |") print(border) # 第四行内容 print(f"| {'The number of words appearing less than 3 times in the first file are :'.ljust(LEFT_DESC_WIDTH)} | {str(result).ljust(LEFT_VAL_WIDTH)} | {' '.ljust(RIGHT_DESC_WIDTH)} | {' '.ljust(RIGHT_VAL_WIDTH)} |") print(border) # 第五行内容 print(f"| {'The number of words appearing less than 3 times in the sec. file are :'.ljust(LEFT_DESC_WIDTH)} | {str(resultt).ljust(LEFT_VAL_WIDTH)} | {' '.ljust(RIGHT_DESC_WIDTH)} | {' '.ljust(RIGHT_VAL_WIDTH)} |") print(border)
代码说明
- 先预设好每一列的固定宽度,比如描述列设宽一点,数值列窄一点;
- 用
ljust(width)把内容填充到指定宽度,保证每列对齐; - 边框线根据预设宽度生成,永远不会错位,内容过长时会自动填充空格,要是想截断内容可以用
str(row[0])[:width].ljust(width)。
这两种方案都能解决你原来的错位问题,自适应的适合内容长度变化大的场景,固定宽度的适合需要统一排版风格的场景,你可以按需选择~
内容的提问来源于stack exchange,提问作者programming freak
相关产品推荐
相关产品推荐

