35

为什么这段代码给出一个KeyError

output_format = """
{ 
    "File": "{filename}", 
    "Success": {success}, 
    "ErrorMessage": "{error_msg}", 
    "LogIdentifier": "{log_identifier}" 
}
"""

print output_format.format(filename='My_file_name',
                           success=True,
                           error_msg='',
                           log_identifier='123')

错误信息:

KeyError: ' "File"'
4

3 回答 3

72

您需要将外部大括号加倍;否则 Python{ "File"..也认为是参考:

output_format = '{{ "File": "{filename}", "Success": {success}, "ErrorMessage": "{error_msg}", "LogIdentifier": "{log_identifier}" }}'

结果:

>>> print output_format.format(filename='My_file_name',
...                            success=True,
...                            error_msg='',
...                            log_identifier='123')
{ "File": "My_file_name", "Success": True, "ErrorMessage": "", "LogIdentifier": "123" }

顺便说一句,如果您正在生成 JSON 输出,则最好使用该json模块

>>> import json
>>> print json.dumps({'File': 'My_file_name',
...                   'Success': True,
...                   'ErrorMessage': '',
...                   'LogIdentifier': '123'})
{"LogIdentifier": "123", "ErrorMessage": "", "Success": true, "File": "My_file_name"}

请注意输出中的小写字母 true,这是 JSON 标准所要求的。

于 2013-05-03T10:31:26.413 回答
4

正如 Tudor 在对另一个答案的评论中提到的那样,模板类是最适合我的解决方案。我正在处理嵌套字典或字典列表,处理这些并不那么简单。

尽管解决方案非常简单,但使用模板。

我从一个转换为字符串的字典开始。{然后,我用模板标识符替换所有实例${以替换占位符。

让它工作的关键是使用 Template 方法safe_substitute。它将替换所有有效的占位符,例如${user_id}但忽略作为字典结构一部分的任何无效占位符,例如${'name': 'John', ....

替换完成后,我删除所有剩余部分$并将字符串转换回字典。

在下面的代码中,resolve_placeholders返回一个字典,其中每个键都与有效负载字符串中的占位符匹配,并且值由 Template 类替换。

from string import Template
.
.
.
payload = json.dumps(payload)
payload = payload.replace('{', '${')
replace_values = self.resolve_placeholders(payload)
if replace_values:
    string_template = Template(payload)
    payload = string_template.safe_substitute(replace_values)
payload = payload.replace('${', '{')
payload = json.loads(payload)
于 2020-10-20T17:43:51.667 回答
2

要扩展Martijn Pieters的 回答和评论:

  1. 根据 MA​​rtijn 的评论,转义不是占位符的 {..} 对是使用嵌套字典的方式。我没有成功,所以我建议以下方法。

  2. 对于嵌套字典,我尝试在嵌套字典的任何 { 和 } 上加倍。

a='{{"names":{{"a":"{name}"}}}}'

a.format(name=123) 输出:

输出:'{"names":{"a":"123"}}'

但这使得使用 format 来更改 json 字符串中的值,这是一种过于复杂的方法,所以我对 format 命令使用了一个扭曲。我将 ${param_name} 替换为 json 字符串。例如:

我预定义的 JSON 如下所示:

my_json_dict = {
     'parameter': [
         {
             'name': 'product',
             'value': '${product}'
         },
         {
             'name': 'suites',
             'value': '${suites}'
         },
         {
             'name': 'markers',
             'value': '${markers}'
         }
     ]
 }

我将此字典作为要替换的值而不是参数提供

parameters = {
    'product': 'spam',
    'suites': 'ham',
    'markers': 'eggs'
}

并使用此代码进行替换

json_str = json.dumps(my_json_dict)
for parameter_name, parameter_value in parameters.iteritems():
        parameter_name = '${'+parameter_name+'}'
        json_str = json_str.replace(parameter_name, parameter_value)

json_dict = json.loads(json_str)
于 2018-07-26T12:34:42.597 回答