Python的print输出对齐
1、 在使用Python的内建函数print作英文输出时,应用格式化输出可以对齐得很好:
参考: https://docs.python.org/3/library/string.html#string-formatting
s1 = 'I am a long sentence.'
s2 = 'I\'m short.'
print '%-30s%-20s' %(s1,s2) #'%-30s' 含义是 左对齐,且占用30个字符位
print '%-30s%-20s' %(s2,s1)
2、 但当字符串包含中文时,却发现它对齐得不是很好:
# -*- coding:utf-8 -*-
#author: Song Bo, Eagle, ZJU
#email: sbo@zju.edu.cn
s1 = '我是一个长句子,是的很长的句子。'
s2 ='我是短句子'
print '%-30s%-20s' %(s1,s2)
print '%-30s%-20s' %(s2,s1)
无法对齐。
原因是这样:在print中,函数为了实现字符串对齐,会在未达到指定长度的字符串末尾添上空格补齐。
但是,问题在这里,它会填入ASCII码为20的space,也就是半角空格。它的长度等于每个字母或数字的宽度,但远比汉字的宽度小,所以导致补足后的字符串长度仍然不同。
解决方案:
重写一个格式对齐函数,函数中判断字符串是否是中文字符串,有的话则添加全角空格补齐,否则添加半角空格补齐。
方法一:
# -*- coding:utf-8 -*-
#author: Song Bo, Eagle, ZJU
#email: sbo@zju.edu.cn
def myAlign(string, length=0):
if length == 0:
return string
slen = len(string)
re = string
if isinstance(string, str):
placeholder = ' '
else:
placeholder = u' '
while slen < length:
re += placeholder
slen += 1
return re
s1 = u'我是一个长句子,是的很长的句子。'
s2 =u'我是短句子'
print myAlign(s1, 20) + myAlign(s2, 10)
print myAlign(s2, 20) + myAlign(s1, 10)
引用: https://blog.csdn.net/sbdxxcjh/article/details/38051573
方法二、 宽度不够时采用中文空格填充
采用.format打印输出时,可以定义输出字符串的输出宽度,在 ‘:’ 后传入一个整数, 可以保证该域至少有这么多的宽度。 用于美化表格时很有用。。但是在打印多组中文的时候,不是每组中文的字符串宽度都一样,当中文字符宽度不够的时候,程序采用西文空格填充,中西文空格宽度不一样,就会导致输出文本不整齐
中文空格的编码为chr(12288)
tplt = "{0:{3}^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format("学校名称", "位置", "分数", chr(12288)))
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2], chr(12288)))
>>> List = [['A', 'B'], ['A134563421', 'B'], ['A', 'B']]
>>> for row in List:
... print '{0:30}{1}'.format(row[0], row[1])
... file.write('{0:30}{1}\n'.format(row[0], row[1]))
A B
A134563421 B
A B
3、Python print 对齐打印,左对齐,右对齐
当需要打印如上左对齐的形式是,我们可以通过s.ljust() 之类的函数来处理。
(1)S.ljust(width,[fillchar])
其中,width 表示对齐的字符数,fillchar 表示空格部分可以用过给定的单个字符来填充,默认是空格。ljust中第一个字母‘l’代表左对齐,不足部分用fillchar填充,默认的为空格。类似地,S.rjust(width,[fillchar]) #右对齐,S.center(width, [fillchar]) # 中间对齐
右对齐