文本格式错误:字符串格式说明符

时间:2016-03-16 18:58:46

标签: python string-formatting

'=' alignment在以下错误消息中的含义是什么?为什么此代码会导致错误消息?

>>> "{num:03}".format(num="1")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: '=' alignment not allowed in string format specifier

代码有一个微妙的问题:输入值"1"是文本,而不是数字。但错误消息似乎与此无关。

错误消息中没有任何内容表明为什么“'='对齐”是相关的, 并且它不会出现在代码中。那么发出错误信息有什么意义呢?

6 个答案:

答案 0 :(得分:35)

出现错误消息,因为格式说明符隐含了'=' alignment

str.format format spec mini-language解析器决定了 对齐说明符“=”因为:

  

使用零('0')字符前面的宽度字段启用   符号识别数字类型的零填充。这相当于一个   用对齐类型'='填充'0'的字符。

因此,通过将0N指定为“零填充到N宽度”,您隐含了“输入是数字类型”,“零应该在符号和数字之间”。后一种含义是'=' alignment的含义。

由于值"1"不是数字,因此“=” - 对齐处理代码会引发该异常。写下这条消息,期待你知道它在说什么,因为你要求(暗示)“=”对齐。

是的,我认为错误信息需要改进。我raised an issue for that

答案 1 :(得分:8)

解决方法是使用'>'(右对齐)填充,其语法如下:

[[fill]align][width]

对齐为>,填充为0,宽度为3

>>> "{num:0>3}".format(num="1")
'001'

问题在于格式规范中有不同的0

format_spec     ::=  [[fill]align][sign][#][0][width][grouping_option][.precision][type]
#                                          ^^^ This one

该零只会使fill默认为0align默认为=

=对齐指定为:

  

强制将填充放置在符号(如果有)之后但在数字之前。这用于以“+000000120”形式打印字段。此对齐选项仅对数字类型有效。当'0'紧跟在字段宽度之前时,它将成为默认值。

Source (Python 3 docs)

这要求参数为int,因为字符串没有符号。所以我们只需手动将其设置为正常默认值>(右对齐)。

另请注意,0仅指定fillalign的默认值。您可以更改两者或仅更改对齐。

>>> # fill defaults to '0', align is '>', `0` is set, width is `3`
>>> "{num:>03}".format(num=-1)
'0-1'
>>> # fill is `x`, align is '>', `0` is set (but does nothing), width is `"3"`
>>> "{num:x>03}".format(num=-1)
'x-1'
>>> # fill is `x`, align is '>', `0` is set (but does nothing), width is `"03"` (3)
>>> "{num:x>003}".format(num=-1)
'x-1'

答案 2 :(得分:5)

str.__format__不知道如何处理03部分。这只适用于数字:

>>> "{num:03}".format(num=1)
'001'

如果您确实想要填充字符串,可以使用rjust

>>> "1".rjust(3, "0")
'001'

答案 3 :(得分:3)

在我的情况下,我试图将字符串而不是数字零填充。

解决方案是在应用填充之前将文本转换为数字:

num_as_text = '23'
num_as_num = int(num_as_text)
padded_text = f'{num_as_num:03}'

答案 4 :(得分:0)

您正在尝试插入&#39; string-&gt;&#34; 1&#34;其中float-> 3.44是必需的。删除引号&#34; 1&#34;,即num = 1,它将起作用

答案 5 :(得分:-1)

这种格式是可以接受的

"{num}:03".format(num="1")

但是您指定占位符{num:03}的方式不是。这是一个有趣的ValueError,但如果删除:,则有趣的错误会被标准KeyError取代。