str.zfill
是用前导零填充字符串的有用工具:
In [1]: '123'.zfill(5)
Out[1]: '00123'
但是,是否有更通用的版本可以采用任何填充字符并用它填充字符串?我正在寻找这样的东西:
In []: 'txt'.foo(' ', 5)
Out[]: ' txt'
In []: '12'.foo('#', 5)
Out[]: '###12'
这样的功能存在吗?
是的,有字符串对齐方法,ljust
和rjust
。
>>> '12'.rjust(5, '#')
'###12'
>>> 'txt'.rjust(5, ' ')
' txt'
>>> '12'.ljust(5, '#')
'12###'
实现自己的版本应该足够简单:
def xfill(string, num, filler='0'):
if len(filler) != 1:
raise TypeError('xfill() expected a character, but string of length %d found' %len(filler))
return filler * max(0, num - len(string)) + string
assert
确保填充物仅是单个有效字符。
xfill(string, num [, filler])
:
string
:要填充的字符串num
:字段的总宽度(类似于str.zfill
(filler
:垫。默认为0
以模拟str.zfill
功能
例子:
In [321]: xfill('123', 5)
Out[321]: '00123'
In [322]: xfill('123', 5, '#')
Out[322]: '##123'
要为替代模式(而不仅仅是字符(添加更多灵活性:
def filler(string, pattern, width):
left_filler = (pattern * width)[:max(0, width - len(string))]
return left_filler + string
>>> filler(string='some text', pattern='*.', width=15)
# Output:
# '*.*.*.some text'
>>> filler(string='some text', pattern='*.', width=14)
# Output:
# '*.*.*some text'
如果你只需要简单的填充,我会接受@PM2Ring的答案,但还有另一种更通用的方法,使用str.format
方法(Python 2.6 以后(。此方法允许您通过嵌套替换字段来插值格式说明符:
'{string:{fill}>{num}}'.format(string=string, fill=fill, num=num)
如果需要改为左对齐字符串,请将>
替换为<
。