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"' |
有什么帮助吗?事先谢谢。
如您所知,
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}' |
您的字符串以
也就是说,看起来您正在尝试构建一个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("]","}") |