Python如何按自定义打印格式实现列内字符串对齐
实现列对齐规整输出的方案
原有代码问题
- 列宽未做固定约束:仅手动拼接少量空格,不同长度的内容(如7位的
Tuesday、2位的03)会直接破坏列对齐效果 - 分隔线长度硬编码:
-/=/^三类分隔线的长度写死为33,和实际表格总宽度不匹配 - 分隔线未按列拆分:整行连续拼接分隔符,没有和列边界对齐,视觉上错位
修复思路
- 提前定义每列的固定宽度,和预期对齐效果匹配:Day列宽8、Month列宽6、Year列宽5、Hour列宽5、Minute列宽7
- 用字符串的
ljust()方法自动给每个单元格内容右侧补空格,刚好填满对应列宽,保证每列长度一致 - 按列宽自动生成对应类型的分隔线(普通分隔用
-、追加数据分隔用=、结尾用^),分隔线在列边界位置自然断开和|对齐 - 自动计算表格总宽度,不再硬编码顶行下划线、底行符号的长度,避免长度不匹配
修复后完整代码
# 定义列配置:(列名, 列固定宽度) COLUMNS = [ ("Day", 8), ("Month", 6), ("Year", 5), ("Hour", 5), ("Minute", 7) ] # 预计算表格总宽度(所有列宽 + 列间隔竖线 + 首尾竖线) TOTAL_WIDTH = sum(w for _, w in COLUMNS) + len(COLUMNS) + 1 # 顶行下划线 top_border = '_' * (TOTAL_WIDTH - 2) + '\n' # 结尾行 end_border = '|' + '^' * (TOTAL_WIDTH - 2) + '|' def build_data_row(values): """生成对齐后的数据行/表头行""" cells = [] for (_, width), val in zip(COLUMNS, values): # 内容左对齐,补空格到对应列宽 cells.append(str(val).ljust(width)) return f"|{'|'.join(cells)}|\n" def build_sep(sep_char): """生成指定字符的分隔线,自动对齐列边界""" sep_cells = [] for _, width in COLUMNS: sep_cells.append(sep_char * width) return f"|{'|'.join(sep_cells)}|\n" t=['Tuesday','July','2022','03','06'] try: with open('time.txt','r') as f: content = f.readlines() except: with open('time.txt','w') as f: f.write('pass') with open('time.txt','r') as f: content = f.readlines() # 用生成好的顶行做判断基准,不再硬编码下划线长度 if not content or content[0] != top_border: with open('time.txt','w') as f: header = top_border + build_data_row([name for name, _ in COLUMNS]) first_sep = build_sep('-') data = build_data_row(t) f.write(header + first_sep + data + end_border) else: with open('time.txt','r+') as f: saved = f.readlines()[:-1] f.seek(0) append_sep = build_sep('=') data = build_data_row(t) f.writelines(saved + [append_sep, data, end_border])
运行效果
运行1次时time.txt输出:
_____________________________________ |Day |Month |Year |Hour |Minute | |--------|------|-----|-----|-------| |Tuesday |July |2022 |03 |06 | |^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|
运行2次时输出:
_____________________________________ |Day |Month |Year |Hour |Minute | |--------|------|-----|-----|-------| |Tuesday |July |2022 |03 |06 | |========|======|=====|=====|=======| |Tuesday |July |2022 |03 |06 | |^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|
和预期对齐效果完全一致,后续如果要调整列宽,只需要修改COLUMNS里的宽度数值即可,所有行、分隔线会自动适配,不需要手动修改其他硬编码长度。
内容的提问来源于stack exchange,提问作者user19506965
相关产品推荐
相关产品推荐

