我想用空格填写一个字符串。我知道以下适用于零:
>>> print "'%06d'"%4
'000004'
但是当我想要这个时我应该怎么做?:
'hi '
当然我可以测量字符串长度并执行str+" "*leftover
,但我想要最短的方法。
"%-6s" % s
用于左对齐,"%6s" % s
用于右对齐。
您可以使用 str.ljust(width[, fillchar])
执行此操作:
返回在长度宽度的字符串中左对齐的字符串。使用指定的填充字符(默认为空格)完成填充。如果宽度小于 len(s),则返回原始字符串。
>>> 'hi'.ljust(10)
'hi '
对于即使在格式化复杂字符串时也能工作的灵活方法,您可能应该使用 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!'
'{message: <{fill}}'.format(message='Hi', fill='16')
str.format()
用于只有一个 {...}
而没有其他内容的模板。只需使用 format()
函数并为自己节省解析开销:format('Hi', '<16')
。
new(ish) string format method 让您可以使用嵌套的关键字参数做一些有趣的事情。最简单的情况:
>>> '{message: <16}'.format(message='Hi')
'Hi '
如果您想将 16
作为变量传递:
>>> '{message: <{width}}'.format(message='Hi', width=16)
'Hi '
如果您想为 whole kit and kaboodle 传递变量:
'{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 '
你可以试试这个:
print "'%-100s'" % 'hi'
"'%+100s'" % 'hi'
可用于在 'hi'
的右侧放置空格
执行此操作的正确方法是使用 the official documentation 中所述的 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!
使用 str.ljust()
:
>>> 'Hi'.ljust(6)
'Hi '
您还应该考虑使用 string.zfill()
、str.ljust()
和 str.center()
进行字符串格式化。这些可以链接并指定'fill'字符,因此:
>>> ('3'.zfill(8) + 'blind'.rjust(8) + 'mice'.ljust(8, '.')).center(40)
' 00000003 blindmice.... '
这些 string formatting operations 具有在 Python v2 和 v3 中工作的优势。
有时间看看pydoc str
:里面有很多好东西。
str.center(n)
方法。这正是我正在寻找的东西,甚至不知道它的存在。 :D
从 Python 3.6 开始,您可以这样做
>>> strng = 'hi'
>>> f'{strng: <10}'
与 literal string interpolation。
或者,如果您的填充大小在一个变量中,像这样(感谢@Matt M.!):
>>> to_pad = 10
>>> f'{strng: <{to_pad}}'
f'{strng: >10}'
用于用前导空格填充字符串,长度为 10。这很神奇。它没有很好的记录。
f'{strng:10}'
的默认行为。
您还可以将字符串居中:
'{0: ^20}'.format('nice')
TL;博士
text = 'hi'
print(f'{text:10}') # 'hi '
更长的解释
从 Python3.6
开始,您可以使用 f 字符串 literal interpolation。
可变空间:
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
使用 Python 2.7 的 mini formatting for strings:
'{0: <8}'.format('123')
这左对齐,并用 ' ' 字符填充到 8 个字符。
只需删除 0 ,它将添加空间:
>>> print "'%6d'"%4
使用切片不是更pythonic吗?
例如,要在右边用空格填充一个字符串,直到它长 10 个字符:
>>> x = "string"
>>> (x + " " * 10)[:10]
'string '
要在左边用空格填充它,直到它有 15 个字符长:
>>> (" " * 15 + x)[-15:]
' string'
当然,它需要知道你想要填充多长时间,但它不需要测量你开始的字符串的长度。
''.join(reversed(str))
比 str[::-1]
更像 Python,我们都知道这不是真的。
(x + " " * 10)[:10]
比使用 x.ljust(10)
复杂得多。
一个很好的技巧来代替各种打印格式:
(1) 右边有空格的填充:
('hi' + ' ')[:8]
(2) 在左边用前导零填充:
('0000' + str(2))[-4:]
min_len = 8
然后 ('hi' + ' '*min_len)[:min_len]
或 ('0'*min_len + str(2))[-min_len]
('0'*min_len + str(2))[-min_len:]
,尽管这只是为了好玩,我推荐其他答案。
您可以使用列表理解来做到这一点,这也可以让您了解空格的数量,并且将是一个单行。
"hello" + " ".join([" " for x in range(1,10)])
output --> 'hello '
s = "hi"
; s + (6-len(s)) * " "
相反(当结果是否定的时候没关系)。但是,使用解决确切问题的任何框架功能的答案将更容易维护(请参阅其他答案)。