在Python中对字符串使用.format时的KeyError

KeyError when using .format on a string in Python

本问题已经有最佳答案,请猛点这里访问。

我有一个字符串,我想使用.format函数python在运行时添加一些变量,这是我的字符串:

1
'{"auth": {"tenantName":"{Insert String Here}","passwordCredentials": {"username":"{insert String here}","password":"{insert String Here}"}}}'

当我使用时。格式如下:

1
credentials='{"auth": {"tenantName":"{tenant}","passwordCredentials": {"username":"{admin}","password":"{password}"}}}'.format(tenant='me',admin='test',password='123')

它给出了以下错误:

1
KeyError: '"auth"'

有什么帮助吗?事先谢谢。


如您所知,{}是字符串格式的特殊字符,因为您将它们用于{tenant}{admin}{password}。所有其他的{}都需要加倍才能逃脱。尝试:

1
credentials='{{"auth": {{"tenantName":"{tenant}","passwordCredentials": {{"username":"{admin}","password":"{password}"}}}}}}'.format(tenant='me',admin='test',password='123')


你用错工具做生意了。您正在处理JSON,需要使用JSON库来解析数据,然后将字段作为字典访问。

1
2
3
4
>>> import json
>>> data_dict = json.loads(data)
>>> data_dict["auth"]["tenantName"]
u'{Insert String Here}'


您的字符串以{"auth"开头。格式字符串分析器一看到大括号就认为"auth"是传入.format()的格式变量的名称。您需要使用双大括号(如{{)来转义模板字符串中的任何大括号。

也就是说,看起来您正在尝试构建一个JSON字符串。只需使用JSON模块就可以了。


.format函数在您的附加大括号上阻塞。它寻找这些大括号作为搜索和替换内容的指示,所以当它看到这些大括号时,它认为它在寻找要替换的键。

您需要退出不用于指示键的大括号。对于.format,这是通过加倍大括号完成的。所以您的代码应该如下所示:

1
credentials='{{"auth": {{"tenantName":"{tenant}","passwordCredentials": {{"username":"{admin}","password":"{password}"}}}}}}'.format(tenant='me',admin='test',password='123')

参见文档:http://docs.python.org/2/library/string.html formatstrings

另请参见此问题:如何在python字符串中打印文本大括号字符并在上面使用.format?


我想牙套可能会害死你。如果您使用的是格式,它希望内的内容是键。也就是说,我认为你不能在一个包含非格式…的字符串中使用.format,因为它不知道如何解析它。但是,您可以做到:

1
credentials='["auth": ["tenantName":"{tenant}","passwordCredentials": ["username":"{admin}","password":"{password}"]]}'.format(tenant='me',admin='test',password='123')

然后做一个

1
2
credentials.replace("[","{")
credentials.replace("]","}")