具有特定宽度的Python字符串
我在找一个好的解释来解决这个问题时遇到了一些麻烦,所以希望你能给我指个方向。
我需要把一个标题和一些数据打印出来,格式要好看,但不幸的是,结果如下所示。
DeviceName KB used KB quota KB hard limit grace
/media/Stuff 58384 5242880 0 none
为此,我创建了一个列表来存放标题。
HEADER=['DeviceName', 'KB USED', . . .]
其他需要打印的内容也是这样做的。为了打印出上面的内容,我做了类似这样的操作。
print "".join('%s'.rjust(5) %i for i in HEADER)
显然,这样做是不行的,因为rjust只是把空格加到字符串的右边。有没有办法打印一个字符串,让它刚好占据一定的宽度,如果字符串不够长,就用空格填充呢?
附注:我只能使用Python 2.4,这意味着我不能使用Python 2.7中的格式化功能。
4 个回答
1
'%s'.rjust(5)
这个内容是在说如何处理字符串中的空格。假设你有一个字面上的 %s
,它代表你的字符串。你要用另一个长度不确定的字符串来替换它,所以在替换之前你不能确定它的对齐方式。
不过,你不想自己手动去调整每个字符串的对齐,因为这个功能已经内置在替换的机制里了。你只需要在 %
和 s
之间放入字段宽度就可以了。
你可以通过测量标题中字符串的长度来动态构建格式字符串。当你格式化时,使用 %%
来生成一个字面上的 %
符号;所以 '%%%ds' % 10
会变成 '%10s'
,这会产生一个宽度为10的字段。
因此,像这样的内容:
format_string = ' '.join('%%%ds' % len(h) for h in HEADER)
print ' '.join(HEADER)
for entry in data: print format_string % entry
2
你想要的正好相反。这样做怎么样:
>>> "%-5s" % 'sss'
'sss '
3
你可以使用 '%*s'
这个格式:
HEADER = "DeviceName |KB used|KB quota|KB hard limit| grace".split('|')
data = ["/media/Stuff", 58384, 5242880, 0, None]
print '|'.join(HEADER)
print '|'.join("%*s" % (width, val) for width, val in zip(map(len,HEADER), data))
输出结果
DeviceName |KB used|KB quota|KB hard limit| grace
/media/Stuff| 58384| 5242880| 0| None