Python字符串格式化 - 旧的`%`和新的`str.format`的区别

9
新格式化方式使我们能够做到这一点:'{:.<12}'.format('##') - 可选的填充字符。
使用旧的格式化方式,我们可以做到这一点吗?
(我知道我们可以用空格填充 '%-12s' % '##'
另外,旧的格式化方式使我们能够做到这一点:'%-*s' % (12, '##') - 变长。
我们可以使用新的格式化方式来实现这一点吗?
3个回答

7
使用新格式进行可变长度的操作,您可以使用替换嵌套 -
>>> '{:{}<{}}'.format('##','.',12)
'##..........'
>>> '{:{}<{}}'.format('##','-',12)
'##----------'
>>> '{:{}<{}}'.format('##','-',20)
'##------------------'

即使使用空格作为填充字符 -

>>> '{:{}<{}}'.format('##',' ',20)
'##                  '

请注意,您不总是需要使用替换的嵌套,您也可以直接以指定格式进行替换 -
>>> '{: <12}'.format('##')
'##          '

您还可以指定每个参数的位置,以决定哪个参数放在哪里。例如 -
>>> '{2:{0}<{1}}'.format('.',12,'##')
'##..........'
>>> '{0:{1}<{2}}'.format('##','-',20)
'##------------------'

嗯,我想知道我的答案哪里有问题。 - Anand S Kumar

3

使用 format 可以嵌套替换:

'{:.<{}}'.format('##',12)

因此,format更加强大。使用%无法进行可选填充字符的操作。

1
对于您问题的第一部分,您可以左对齐并使用空格作为填充字符,宽度为12:'{: <12}'.format('##') 可以替换 '%-*s' % (12, '##')
对于第二部分,旧样式格式化不能指定填充字符。
有一个很好的网站here展示了旧版与新版的大部分差异,其中包括字符串填充和对齐的片段: 填充和对齐字符串 默认情况下,值的格式仅占用表示其内容所需的字符数。但是,还可以定义某个值应填充到特定长度。
不幸的是,旧样式和新样式的默认对齐方式不同。旧样式默认为右对齐,而新样式默认为左对齐。
Align right:

Old '%10s' % ('test',) 
New '{:>10}'.format('test')

Align left:

Old

'%-10s' % ('test',)
New

'{:10}'.format('test')

通过参数:

在前面的例子中,值“10”作为格式字符串的一部分进行编码。但是,也可以将这样的值作为参数提供。

Old

'%*s' % ((- 8), 'test')
New

'{:<{}s}'.format('test', 8)

再次强调,新样式格式优于旧样式格式,因为它提供了更多控制值填充和对齐的方式。您可以选择填充字符:

这种操作在旧样式格式中不可用。

New

'{:_<10}'.format('test')
Output

并且居中对齐数值:

旧式格式化不支持此操作。

New

'{:^10}'.format('test')

首先,想法是要有可变长度。嵌套格式解决了这个问题。感谢提供 pyformat 的链接! - avamsi
没问题,然后嵌套{}就可以完成工作'{: <{}}'.format('##',var)或者'{: <{var}}'.format('##,var=var') - Padraic Cunningham

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