如何在Python字符串中填充空格?

748
我想用空格填充一个字符串。我知道以下方法适用于零的情况:
>>> print("'%06d'"%4)
'000004'

但是当我想要这个的时候,我应该怎么办呢?
'hi    '

当然我可以测量字符串的长度并执行str+" "*leftover,但我希望找到最简洁的方法。

3
我知道这种方法可能会在将来被废弃,但我仍然喜欢这个古老的好方法:使用"%-6s" % s进行左对齐,使用"%6s" % s进行右对齐。 - Basj
14个回答

976

你可以使用 str.ljust(width[, fillchar]) 来实现:

将字符串左对齐,并填充到长度为width的字符串中。填充使用指定的fillchar(默认为空格)。如果width小于len(s),则返回原始字符串。

>>> 'hi'.ljust(10)
'hi        '

23
@Simon的答案在格式化更复杂的字符串时更加灵活和有用。 - CoatedMoose
4
如果您被困在支持旧版本的Python上,可以使用@abbot的。 - CoatedMoose
2
ljust()现在已经被弃用。请参考https://dev59.com/2mUq5IYBdhLWcg3wHcz5以了解正确的方法。 - Mawg says reinstate Monica
1
Python 3里没有了吗?只想补充一下,还有rjust和center可以用于不同的对齐方式。 - radtek
28
ljust()和rjust()已从string模块中弃用,它们现在可以在str内置类型中使用。 - Rohan Grover
让我数一下:“hi12345678” - undefined

584

对于一种即使在格式化复杂字符串时也能灵活使用的方法,您可能应该使用string-formatting mini-language

使用f-strings

>>> f'{"Hi": <16} StackOverflow!'  # Python >= 3.6
'Hi               StackOverflow!'

或者使用str.format()方法

>>> '{0: <16} StackOverflow!'.format('Hi')  # Python >=2.6
'Hi               StackOverflow!'

33
如果你的变量中有数字'16',该怎么办? - Randy
1
当我使用国际音标时,我遇到了这种格式化类型的问题。你希望'kra'和'krá'是相同的,但它们并不相同。 - quapka
102
'{message: <{fill}}'.format(message='Hi', fill='16')' 的翻译是:使用填充符号 < ,将字符串 'Hi' 左对齐,并在总长度为 16 的字段中显示。 - CivFan
29
如果模板中只有一个{...}且没有其他内容,请不要使用str.format()。直接使用format()函数,可以避免解析开销:format('Hi', '<16') - Martijn Pieters
2
@aaaaaa 可读性是主观的。我非常喜欢这个答案,它非常简洁明了。 - LogicDaemon
显示剩余4条评论

213

字符串格式化方法允许您使用嵌套关键字参数进行一些有趣的操作。最简单的情况:

>>> '{message: <16}'.format(message='Hi')
'Hi             '

如果您想将 16 作为变量传入:
>>> '{message: <{width}}'.format(message='Hi', width=16)
'Hi              '

如果您想为整个套件传递变量:
'{message:{fill}{align}{width}}'.format(
   message='Hi',
   fill=' ',
   align='<',
   width=16,
)

这会导致(你猜对了):
'Hi              '

对于所有这些,您都可以使用Python 3.6+ f-strings

message = 'Hi'
fill = ' '
align = '<'
width = 16
f'{message:{fill}{align}{width}}'

当然还有结果:

'Hi              '

你如何处理消息的变化呢?msgs = ['嗨', '你好', '再见'] - ak_slick
1
@ak_slick 你可以将变量传递到 format 函数中,而不是硬编码的值。 - CivFan

90
你可以试试这个:
print("'%-100s'" % 'hi')

打印 "'%-6s'" % 'hi' 真的没错!! - taper
8
作为一个被困在 Python 2.5 系统中的人,这个回答对我很有帮助,不是毫无用处的回答,加一分。 - sunshinekitty
18
3.3及以上版本已不再弃用。 - Seppo Erviälä
3
我更喜欢这种常见的printf语法。它允许你编写复杂的字符串而不需要无数次的连接操作。 - Max Tsepkov
4
为了完整起见,"'%+100s'" % 'hi' 可以用于在 'hi' 的右侧添加空格。 - Eric Blum

89

正确的做法是使用Python的格式语法,如官方文档中所述。

对于这种情况,可以简单地使用以下格式:
'{:10}'.format('hi')
输出结果为:
'hi '

说明:

format_spec ::=  [[fill]align][sign][#][0][width][,][.precision][type]
fill        ::=  <any character>
align       ::=  "<" | ">" | "=" | "^"
sign        ::=  "+" | "-" | " "
width       ::=  integer
precision   ::=  integer
type        ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
基本上你需要知道的都在那里^。
更新: 从Python 3.6开始,使用字面字符串插值甚至更方便!
foo = 'foobar'
print(f'{foo:10} is great!')
# foobar     is great!

63
使用str.ljust()函数:
>>> 'Hi'.ljust(6)
'Hi    '

您还应该考虑使用 string.zfill(), str.rjust()str.center() 进行字符串格式化。这些可以链接在一起并指定'填充'字符,例如:

>>> ('3'.zfill(8) + 'blind'.rjust(8) + 'mice'.ljust(8, '.')).center(40)
'        00000003   blindmice....        '

这些字符串格式化操作的优点是可以在Python v2和v3中使用。
有空的时候看看pydoc str,里面有很多好东西。

3
谢谢指出 str.center(n) 方法。这正是我正在寻找的,而且我甚至不知道它的存在。 :D - LukeSavefrogs

42

简述

text = 'hi'
print(f'{text:10}') # 'hi        '

更详细的解释

Python3.6开始,您可以使用f-strings字面插值

变量空间:

value = 4
space = 10

# move value to left
print(f'foo {value:<{space}} bar') # foo 4          bar
# move value to right
print(f'foo {value:>{space}} bar') # foo          4 bar
# center value
print(f'foo {value:^{space}} bar') # foo     4      bar

恒定的空间复杂度:

value = 4

# move value to left
print(f'foo {value:<10} bar') # foo 4          bar
# move value to right
print(f'foo {value:>10} bar') # foo          4 bar
# center value
print(f'foo {value:^10} bar') # foo     4      bar
如果您想使用除空格以外的其他字符进行填充,请在开头指定:
value = 4
space = 10
padd = '_'

print(f'foo {value:{padd}^{space}} bar') # foo ____4_____ bar
print(f'foo {value:_^10} bar')           # foo ____4_____ bar

3
今天,这应该是优先考虑的方法。 - kva1966
我发现这种方法比ljust/rjust更好。 例如,假设zip_code是一个整数,使用rjust应用一些格式的方式是str(zip_code).rjust(3, "0"),而使用这种方法的等效方式是f"{zip_code:0>3}"。小巧且更易读! 问题?慢一些.. *只有在您关心此事时才会出现。(根据我的测试,仅降低10%的速度) - Lucas Vazquez

40

截至Python 3.6,您只需执行以下操作即可

>>> strng = 'hi'
>>> f'{strng: <10}'

使用字面字符串插值

或者,如果您的填充大小是以变量的形式存在,可以像这样操作(感谢@Matt M.!):

>>> to_pad = 10
>>> f'{strng: <{to_pad}}'

8
f'{strng: >10}'可以在字符串前面填充空格,使其达到长度为10。这真是神奇的功能,但是它的文档说明不够清晰。 - Chang Ye
1
@changye 我相信这也是 f'{strng:10}' 的默认行为。 - WAF

21

你还可以居中你的字符串:

'{0: ^20}'.format('nice')

10

4
@simon已经回答了这个问题……为什么要再发一篇重复的答案? (翻译:@simon已经回答了这个问题,为什么要发布一个重复的答案?) - Felix Kling
5
我没有点击“有新回复,请刷新”按钮,因此错过了它。 - aodj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接