Formato de cadena Una cadena JSON le da a KeyError

¿Por qué este código da un 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') 

Mensaje de error:

 KeyError: ' "File"' 

Necesitas doblar los tirantes exteriores; de lo contrario, Python piensa que { "File".. es una referencia:

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

Resultado:

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

Si, de manera indicativa, está produciendo una salida JSON, sería mejor que usara el módulo json :

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

Tenga en cuenta que la minúscula es true en la salida, como lo requiere el estándar JSON.

Para ampliar la respuesta y el comentario de Martijn Pieters :

  1. De acuerdo con el comentario de MArtijn, escapar de los pares {..} que no son marcadores de posición es su forma de ir con los diccionarios nesteds. No lo he logrado, por lo que sugiero el siguiente método.

  2. Para los diccionarios nesteds, intenté duplicar cualquier {y} de los diccionarios nesteds.

a = ‘{{“nombres”: {{“a”: “{nombre}”}}}}’

a.format (nombre = 123) salida:

salida: ‘{“nombres”: {“a”: “123”}}’

Pero esto hace que usar el formato para cambiar los valores dentro de una cadena json, un método demasiado complejo, por lo que uso un giro en el comando de formato. Reemplazo $ {param_name} en una cadena json. Por ejemplo:

Mi JSON predefinido se ve así:

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

Proporciono este diccionario como valores para reemplazar en lugar de los parámetros.

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

Y usa este código para hacer el reemplazo.

 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)