2013-12-19 152 views
4

使用上的绳子.format时,我有一个字符串,我想用.format蟒功能,在其上添加运行一些变数,这是我的字符串:KeyError异常在Python

'{"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"' 

任何帮助?提前致谢。

+0

你可以把你完整的代码在这里? – 2013-12-19 04:16:11

+2

您需要转义额外的'{'s –

+0

这是迄今为止的完整代码。我只需要调整我指定的3个字符串。 – mobykhn

回答

11

{}是字符串格式的特殊字符,因为你清楚地知道,因为你正在使用他们的{tenant}{admin}{password} 。所有其他{ s和}都需要通过加倍来逃脱。尝试:

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

感谢这工作 – mobykhn

-1

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

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

然后做一个

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

这并不理想。看文档:http://docs.python.org/2/library/string.html#formatstrings –

+0

事实上,这只会造成浩劫。 – Iguananaut

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?

+0

@BurhanKhalid它不需要代码,这显然是一个固定的json数据结构。 –

0

你的字符串开头{"auth"。只要格式字符串解析器看到该开放大括号,就认为"auth"是传递给.format()的格式变量的名称。您需要使用双卷曲线将模板字符串中的花括号转义出来,如{{

这就是说,它看起来像你试图建立一个JSON字符串。只需使用json模块即可。

4

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

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

很好的解决方法。 – Kracekumar