Python中在字符串上使用.format时出现KeyError问题

15

我有一个字符串,想要在运行时使用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"'

需要帮助吗?提前致谢。


2
你需要转义额外的 { 符号。 - desired login
这是目前为止的完整代码。我只需要调整我指定的3个字符串。 - mobykhn
我认为格式化无法处理嵌套的大括号。你需要排除那些不是用于变量的大括号。 - bnjmn
额外的 '{' 在哪里 @desiredlogin - mobykhn
我不明白你说的话 @bnjmn - mobykhn
显示剩余2条评论
5个回答

29

{} 是用于字符串格式化的特殊字符,您已经清楚地知道了这一点,因为您正在使用它们来表示{tenant}{admin}{password}。所有其他的{}都需要通过加倍来进行转义。试试这样做:

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

2
感谢上帝,在半天的头痛之后,我终于找到了你的答案! - Al Po

6

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

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

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

还可以参考这个问题: 如何在Python字符串中打印花括号并使用.format函数?


@BurhanKhalid 这不需要代码,这显然是一个固定的JSON数据结构。 - Ash Eldritch

0

你的字符串以{"auth"开头。一旦格式化字符串解析器看到这个左花括号,它就认为"auth"是传递给.format()的格式变量的名称。你需要用双花括号{{转义模板字符串中的任何花括号。

话虽如此,看起来你正在尝试构建一个JSON字符串。只需使用json模块即可。


-1

我认为大括号可能会让你出现问题。如果你正在使用 format,它期望 { } 内的内容是键。也就是说,我认为你不能在包含非格式化“{...}”的字符串中使用 .format,因为它不知道如何解析它。但是,你可以这样做:

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

然后执行

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

这不是理想的。请参阅文档:http://docs.python.org/2/library/string.html#formatstrings - Ash Eldritch
1
确实这只会造成混乱。 - Iguananaut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接