关于文本输出内容的对齐问题

张开发
2026/4/20 9:17:29 15 分钟阅读

分享文章

关于文本输出内容的对齐问题
在Python语言中对于文本内容最为简单的对齐方法可以使用两种方式第一种是Tab键即键盘左上角的Tab键它会自动将下一个输出内容按照定宽整数比的距离来自动设置。即使连续输出多个长度不一的字符串中间使用Tab键相隔也会自动形成定宽输出的效果比如print(a\tbb) print(ccc\tdddd)输出为a bbccc dddd可以看出默认使用即使前面字符串的长度不一但是在Tab键后再次输出的内容保持左边上下对齐。巧妙使用Tab键可以快速实现简单的对齐效果。如for i in range(1, 10): print(i * i, end\t) if i % 3 0: print()输出为1 4 916 25 3649 64 81第二种方法是利用Python自带的字符串格式化方法做法很多下面只以format函数为例。print({:4}.format(1)) print({:4}.format(200))输出为1200此时1的前面有三个空格包括1在内共计4个字符位1右对齐这些都是“4”格式控制的效果。因此利用这个方法我们可以重写刚才的连续整数输出for i in range(1, 10): print({:4}.format(i * i), end) if i % 3 0: print()输出为1 4 916 25 3649 64 81但是仔细的读者可以注意到此时对于字母和数字效果都比较好但是如果换成了汉字情况就变化了print({:4}.format(1)) print({:4}.format(汉字))输出为1汉字原因很简单汉字较宽字母和数字较窄因此按字符个数来定位必然会产生宽窄不统一的可能性。甚至即使对于只使用英文字母的输出内容如果复制到其他文本编辑器中并使用了不等宽的字体依然还会出现不对齐的可能。此时并不是代码问题而是字体问题。可以考虑使用等宽的英文字体而对于中英文混用输出而言大部分字体都不会使用相同宽度来显示因此仍然较难对齐。更为有效的方法可以考虑两种方法一是使用网页表格比如上述两个数值的上下对齐print(htmltable) print(trtd alignright{}/td/tr.format(1)) print(trtd alignright{}/td/tr.format(200)) print(/table/html)输出为htmltabletrtd alignright1/td/trtrtd alignright200/td/tr/table/html复制粘贴到文本文件并改为HTML扩展名即可在浏览器中看到上下右对齐。二是使用第三方对齐模块比如rich模块在使用pip安装后代码修改为from nltk.corpus.reader import titles from rich.console import Console from rich.table import Table console Console() table Table() table.add_column(justifyright, stylecyan, no_wrapTrue) table.add_row(str(1)) table.add_row(str(200)) console.print(table)此时直接输出可能效果不好┏━━━━━┓┃ ┃┡━━━━━┩│ 1 ││ 200 │└─────┘此时Windows用户可以打开命令行窗体CMD再运行代码效果可以更好。最后通过几个练习串一下。准备将学生课程成绩信息的记录使用数据透视表来展示比如有这是第一个代码使用了Tab键data {(张三, 语文): 80, (张三, 数学): 94, (李四, 语文): 79, (李四, 英语): 99, (王二, 数学): 81} names set([unit[0] for unit in data]) courses set([unit[1] for unit in data]) print(\t.join([\t] [name for name in names])) for course in courses: print(course, end\t) for name in names: print(str(data[(name, course)]) \t if (name, course) in data else \t, end\t) print()输出为王二 李四 张三数学 81 94英语 99语文 79 80实际你看到的效果可能不好但是这里效果还行。这是因为字体显示宽度不同而不同即使是这里也出现了左右对齐成绩的不统一效果。再次使用format格式化data {(张三, 语文): 80, (张三, 数学): 94, (李四, 语文): 79, (李四, 英语): 99, (王二, 数学): 81} names set([unit[0] for unit in data]) courses set([unit[1] for unit in data]) print(.join([{:8}.format()] [{:8}.format(name) for name in names])) for course in courses: print({:8}.format(course), end) for name in names: print({:8}.format(data[(name, course)]) if (name, course) in data else {:8}.format(), end) print()输出为王二 张三 李四语文 80 79数学 81 94英语 99实际你看到的效果可能较好但是这里却因为字体显示宽度不同而不同。但是仍然会存在汉字和数字宽度不同的差异。再次修改下使用Tab和format综合表达data {(张三, 语文): 80, (张三, 数学): 94, (李四, 语文): 79, (李四, 英语): 99, (王二, 数学): 81} names set([unit[0] for unit in data]) courses set([unit[1] for unit in data]) print(.join([{:4}\t.format()] [{:4}\t.format(name) for name in names])) for course in courses: print({:4}\t.format(course), end) for name in names: print({:4}\t.format(data[(name, course)]) if (name, course) in data else {:4}\t.format(), end) print()输出为这个实际显示效果是最好的。即使改变课程名称使其长度不一问题也不大。最后我们来试试rich模块。from rich.table import Table from rich.console import Console data {(张三, 语文): 80, (张三, 数学): 94, (李四, 语文): 79, (李四, 英语): 99, (王二, 数学): 81} names sorted(set([unit[0] for unit in data])) courses sorted(set([unit[1] for unit in data])) table Table(title处理结果汇总, border_stylegreen) table.add_column(课程, stylebold, justifycenter) for name in names: table.add_column(name, stylebold, justifyright) for course in courses: row [course] for name in names: score str(data[(name, course)]) if (name, course) in data else row.append(score) table.add_row(*row) console Console() console.print(table)该代码使用了更为漂亮的颜色格式需要使用命令行窗体来运行

更多文章