我有一个字符串,我想使用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"'
任何帮助?在此先感谢。
答案 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("]","}")