如何用空格填充Python字符串?


508

我想用空格填充字符串。我知道以下内容适用于零:

>>> print  "'%06d'"%4
'000004'

但是,当我想要这个怎么办?:

'hi    '

当然,我可以测量字符串长度并这样做str+" "*leftover,但我想用最短的方法。


1
我知道将来可能会弃用它,但是我仍然喜欢这种好的旧方法:"%-6s" % s左对齐和"%6s" % s右对齐。
Basj

Answers:


698

您可以使用str.ljust(width[, fillchar])

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

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

18
@simon的答案在格式化更复杂的字符串时更灵活,更有用
CoatedMoose13年

3
或@abbot,如果您坚持支持旧版本的python
CoatedMoose 2013年

1
ljust()现在已弃用。参见stackoverflow.com/questions/14776788/…了解正确的方法
Mawg说起用莫妮卡

它在python 3中消失了吗?只是想补充一下,还有校正和居中功能,它们的工作方式大致相同,但适用于不同的对齐方式
radtek

17
仅从字符串模块中弃用了ljust(),rjust()。它们在str内置类型上可用。
罗汉·格罗弗

372

为了即使在格式化复杂的字符串时也可以使用灵活的方法,您可能应该使用string-formatting mini-language,无论使用哪种str.format()方法

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

F-串

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

11
如果变量中有“ 16”怎么办?
兰迪

我也知道了。应该已经发布了。文档说这应该适用于Py2.6,但是我的发现却相反。虽然可以在Py2.7中使用。
兰迪2014年

1
我在使用民族口音时遇到这种格式的问题。您可能希望“ kra”和“krá”相同,但事实并非如此。
quapka 2014年

77
@Randy'{message: <{fill}}'.format(message='Hi', fill='16')
CivFan 2015年

19
不要str.format()只使用一个模板,不要使用其他模板{...}。只需使用该format()函数即可,节省您的解析开销:format('Hi', '<16')
马丁·皮特斯

119

新的(ish)字符串格式方法使您可以使用嵌套关键字参数来做一些有趣的事情。最简单的情况:

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

如果要16作为变量传递:

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

如果要为整个工具包和kaboodle传递变量,请执行以下操作

'{message:{fill}{align}{width}}'.format(
   message='Hi',
   fill=' ',
   align='<',
   width=16,
)

结果(您猜对了):

'Hi              '

您还将如何处理各种消息?msgs = ['hi','hello','ciao']
ak_slick

1
@ak_slick您可以将变量而不是硬编码的值传递给format函数。
CivFan

80

您可以尝试以下方法:

print "'%-100s'" % 'hi'

打印“'%-6s'”%“嗨”的确!
逐渐

8
@simon,因为有人卡在python2.5系统上,此答案对我有帮助,而不是无用的答案+1
sunshinekitty

18
在3.3+版本中不再弃用
SeppoErviälä15年

3
我更喜欢这种常见的printf语法。允许您编写复杂的字符串而无数个串联。
Max Tsepkov

4
为了完整"'%+100s'" % 'hi'起见,请将其放置在右边的位置上'hi'
埃里克·布鲁姆

62

正确的方法是使用官方文档中所述的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!


27

从Python 3.6开始,您可以执行

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

文字字符串插值

或者,如果您的填充大小在变量中,例如这样(感谢@Matt M.!):

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

4
f'{strng: >10}'用前导空格填充字符串的长度为10。这很神奇。而且它没有很好的记录。
张野

@changye我相信这也是的默认行为f'{strng:10}'
WAF

17

您还可以将字符串居中

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

7

对字符串使用Python 2.7的迷你格式

'{0: <8}'.format('123')

左对齐,并用''字符填充到8个字符。


4
@simon已经给出了答案...为什么要发布重复的答案?
Felix Kling

5
我没有点击“新回复已发布,请点击刷新”,所以错过了。
aodj 2011年


2

使用切片会不会更pythonic?

例如,要在字符串的右边填充空格,直到其长度为10个字符:

>>> x = "string"    
>>> (x + " " * 10)[:10]   
'string    '

要在其左侧填充空格,直到其长度为15个字符:

>>> (" " * 15 + x)[-15:]
'         string'

当然,它需要知道要填充多长时间,但是并不需要测量开始的字符串的长度。


9
不,不会。
疯狂物理学家,2015年

1
您能详细说明一下吗?不是我不相信你,我只是想了解为什么。
Zev Chonoles 2015年

4
当然。最Python化的方法是使用内置函数之一,而不是尽可能使用本地解决方案。
疯狂物理学家,2015年

@MadPhysicist说切片比pythonic少,因为您应该在内置函数中使用,就像说''.join(reversed(str))比pythonpythonic多str[::-1],而我们都知道那是不对的。
尼克

@NickA。这不是一个很好的类比。您作为示例使用的情况非常有效。但是,(x + " " * 10)[:10]在我看来,比使用更加令人费解x.ljust(10)
疯狂物理学家

0

一个很好的技巧来代替各种打印格式:

(1)在右边加空格:

('hi' + '        ')[:8]

(2)在左前导零处填充:

('0000' + str(2))[-4:]

1
出于某种原因,这是最有趣的答案,但我喜欢它。遵循这些原则,还应考虑: min_len = 8然后('hi' + ' '*min_len)[:min_len]('0'*min_len + str(2))[-min_len]
Poikilos

1
对于数字来说('0'*min_len + str(2))[-min_len:],虽然这只是出于娱乐目的,但宁可推荐其他答案。
Poikilos

-1

您可以使用列表理解来做到这一点,这也会使您对空格的数量有所了解,并且只能是一个内衬。

"hello" + " ".join([" " for x in range(1,10)])
output --> 'hello                 '

...然后您得到一个长度为22(len(“ hello”)+ 17 :()个字符的字符串-效果不佳。虽然我们很有趣,但我们可以做到s = "hi"s + (6-len(s)) * " "相反(当-结果是负面的。)但是,使用解决确切问题的任何框架功能的答案将更易于维护(请参阅其他答案)
Poikilos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.