Python字符串格式化 - 旧`%`vs new`str.format`

时间:2015-08-16 19:49:18

标签: python string python-2.7 string-formatting

新格式允许我们执行此操作:'{:.<12}'.format('##') - 可选填充字符 我们可以使用旧格式来做到这一点吗? (我知道我们可以填充空格'%-12s' % '##'

此外,旧的格式允许我们执行此操作:'%-*s' % (12, '##') - 可变长度 我们可以使用新的格式吗?

3 个答案:

答案 0 :(得分:5)

为了使用new-format进行可变长度,您可以使用替换嵌套 -

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

甚至空格作为填充字符 -

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

请注意,您并不总是需要使用替换嵌套,您也可以直接以格式指定它们 -

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

您还可以指定每个参数的位置,以确定哪个参数位于何处。示例 -

>>> '{2:{0}<{1}}'.format('.',12,'##')
'##..........'
>>> '{0:{1}<{2}}'.format('##','-',20)
'##------------------'

答案 1 :(得分:2)

使用format,您可以嵌套替换项:

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

所以format更强大。 %无法使用可选的填充字符。

答案 2 :(得分:1)

对于问题的第一部分,您可以保持对齐并使用空格作为填充字符,宽度为12:

'%-*s' % (12, '##')可以替换为'{: <12}'.format('##')

对于第二部分,您不能使用旧样式格式指定填充字符。

有一个不错的网站here,它显示了旧版和新版的大部分功能,一个覆盖填充和对齐字符串的代码段:

填充和对齐字符串

  

默认情况下,值的格式设置为只占用表示内容所需的字符数。但是,也可以定义一个值应填充到特定长度。

     

不幸的是,旧式和新式格式之间的默认对齐方式不同。旧样式默认为右对齐,而新样式则左对齐。

Align right:

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

Align left:

Old

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

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

通过参数:

  

在前面的示例中,值&#39; 10&#39;被编码为格式字符串的一部分。但是,也可以将这些值作为参数提供。

Old

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

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

同样,通过提供对填充和对齐值的更多控制,新样式格式优于旧变体。   您可以选择填充字符:

此操作不适用于旧式格式。

New

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

还有居中对齐值:

此操作不适用于旧式格式。

New

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