具有特定宽度的Python字符串

1 投票
4 回答
2940 浏览
提问于 2025-04-17 05:31

我在找一个好的解释来解决这个问题时遇到了一些麻烦,所以希望你能给我指个方向。

我需要把一个标题和一些数据打印出来,格式要好看,但不幸的是,结果如下所示。

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

撰写回答