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

时间:2013-12-19 04:12:43

标签: python string

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

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

当我像这样使用.format:

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

它给了我以下错误:

KeyError: '"auth"'

任何帮助?在此先感谢。

5 个答案:

答案 0 :(得分:18)

{}是字符串格式的特殊字符,因为您清楚地知道,因为您将它们用于{tenant}{admin}{password} 。所有其他{}都需要通过加倍来逃避。尝试:

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

答案 1 :(得分:6)

您使用错误的工具进行交易。您正在处理json,您需要使用json库来解析数据,然后以字典的形式访问您的字段

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

答案 2 :(得分:0)

.format函数在额外的{}括号上窒息。它正在寻找那些大括号作为搜索和替换内容的指示,因此当它看到那些大括号时,它认为它正在寻找替换的关键。

您需要转义不用于指示键的大括号。对于.format,这是通过加倍支撑来完成的。所以你的代码应该是这样的:

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

另见这个问题: How can I print literal curly-brace characters in python string and also use .format on it?

答案 3 :(得分:0)

您的字符串以{"auth"开头。一旦格式字符串解析器看到打开大括号,它就会认为"auth"是传递给.format()的格式变量的名称。您需要使用double curly_braces(例如{{)来转义模板字符串中的任何花括号。

那就是说,看起来你正在尝试构建一个JSON字符串。只需使用json模块即可。

答案 4 :(得分:-1)

我认为大括号可能会杀了你。如果您正在使用格式,它希望{}内的内容成为键。也就是说,我认为你不能在包含非格式化`{...}'的字符串中使用.format,因为它不知道如何解析它。但是,您可以这样做:

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

然后做一个

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