HOWTO · Python
Convertir diccionario a cadena en Python
Este tutorial demuestra cómo convertir un diccionario en una cadena y viceversa en Python
En esta página
Un diccionario puede convertirse en una cadena para mostrarla, registrarla o intercambiar datos, pero cada uso requiere un formato distinto. str() proporciona la representación de Python, json.dumps() genera texto JSON para el intercambio, pprint.pformat() crea un formato legible y un bucle permite definir un formato de presentación. Todos estos resultados son cadenas, pero no conservan los mismos tipos ni garantizan que se pueda reconstruir el diccionario original.
Elige la forma adecuada de convertir un diccionario en una cadena
Usa str() cuando necesites una representación rápida orientada a Python, por ejemplo, para un mensaje de depuración. Usa json.dumps() si otro sistema espera JSON y tus valores pertenecen a los tipos admitidos por JSON. Elige pprint.pformat() para facilitar la inspección de datos anidados de Python. Crea una cadena personalizada cuando necesites una disposición concreta, como name: Alice, score: 9.
Estos formatos de serialización no son intercambiables. Una cadena de presentación personalizada y el resultado de str() pueden ser ambiguos o inadecuados para que otro programa los analice. JSON admite objetos, matrices, cadenas, números, valores booleanos y null; los valores propios de Python, como las tuplas o los conjuntos, requieren conversión u otro método. Pickle tampoco convierte datos en una cadena: su serialización produce bytes y cargar datos pickle de una fuente no confiable puede ejecutar código dañino.
Usa str() para obtener una representación de Python
str(dictionary) es la opción concisa cuando basta con una representación legible de Python. Incluye las llaves del diccionario y las representaciones de estilo Python de las claves y los valores. El formato exacto está pensado para Python, no como un contrato de datos entre lenguajes: por ejemplo, Python usa True y None, mientras que JSON usa true y null.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
details = {"name": "Ada", "active": True}
text = str(details)
print(type(text).__name__)
print(text)
str
{'name': 'Ada', 'active': True}
Evita asignar el diccionario a una variable llamada dict, ya que eso oculta el tipo integrado de Python. Recuerda también que convertir un objeto en texto no hace que ese texto sea reversible.
Serializa un diccionario como JSON con json.dumps()
Para obtener una cadena estándar de intercambio de datos, usa json.dumps(). La función correspondiente, json.loads(), analiza texto JSON y lo convierte de nuevo en valores de Python. El recorrido de ida y vuelta con JSON conserva los datos compatibles con JSON, pero no todos los tipos de Python: las tuplas se convierten en matrices y se cargan como listas, y las claves del diccionario deben ser de tipos admitidos por JSON. De forma predeterminada, los caracteres que no son ASCII se representan con secuencias de escape; establece ensure_ascii=False para que aparezcan directamente. Usa indent para facilitar la lectura del JSON o sort_keys=True para mantener un orden estable de las claves cuando te convenga.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import json
record = {"name": "Ada", "score": 9}
text = json.dumps(record)
restored = json.loads(text)
print(text)
print(restored == record)
{"name": "Ada", "score": 9}
True
El valor que devuelve json.dumps() es una cadena. Si un diccionario contiene valores que JSON no puede codificar, define una estrategia de conversión deliberada o elige un formato diseñado para esos datos; no des por sentado que JSON admite todos los objetos de Python.
Da formato legible a un diccionario con pprint.pformat()
Usa pprint.pformat() cuando quieras obtener una cadena con formato en vez de imprimirla directamente en la consola. Resulta útil para datos anidados porque puede distribuir estructuras largas en varias líneas. El resultado sigue siendo una representación de presentación orientada a Python, no JSON. Sus opciones permiten ajustar el ancho, la sangría, la profundidad y la compactación; un límite de profundidad abrevia el contenido anidado, por lo que el resultado formateado quizá no muestre todos los valores.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import pprint
record = {"user": {"name": "Ada", "roles": ["author", "editor"]}}
text = pprint.pformat(record, sort_dicts=False)
print(type(text).__name__)
print(text)
str
{'user': {'name': 'Ada', 'roles': ['author', 'editor']}}
Usa la cadena devuelta donde la necesites, por ejemplo, en un mensaje de registro. En cambio, pprint.pprint() escribe el texto formateado en un flujo y sirve cuando quieres imprimirlo en lugar de conservar el resultado en una variable.
Crea una cadena personalizada con un bucle
Un formato personalizado permite controlar los separadores y las etiquetas. Una comprensión con str.join() evita concatenar cadenas repetidamente y facilita omitir un delimitador final. Si otro programa analizará el resultado, decide cómo tratar los valores que puedan contener el separador elegido; un formato de presentación sencillo no define reglas de escape automáticamente.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
scores = {"Ada": 9, "Lin": 8}
text = ", ".join(f"{name}: {score}" for name, score in scores.items())
print(text)
Ada: 9, Lin: 8
Este formato sirve para una línea destinada a una persona. Si necesitas intercambiar el resultado o guardarlo para analizarlo más adelante, usa JSON o define e implementa un formato con reglas explícitas de entrecomillado y escape.
Convierte una cadena de nuevo en un diccionario
Usa json.loads() para analizar una cadena JSON. Acepta sintaxis JSON, no cualquier salida de Python producida por str(). Si controlas una cadena que contiene un literal de Python, ast.literal_eval() puede analizar estructuras literales admitidas, incluido un diccionario, sin evaluar expresiones arbitrarias de Python. No es un analizador de uso general y no debe utilizarse con entradas no confiables, muy grandes o que consuman muchos recursos. Valida el tipo y el contenido del resultado para tu aplicación.
Ejecuta este ejemplo:
El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.
import ast
import json
json_text = '{"name": "Ada", "score": 9}'
python_text = "{'name': 'Ada', 'score': 9}"
print(json.loads(json_text))
print(ast.literal_eval(python_text))
{'name': 'Ada', 'score': 9}
{'name': 'Ada', 'score': 9}
Elige el analizador que corresponda al formato que generó la cadena. Ninguno de los dos puede recuperar de forma fiable un diccionario a partir de una cadena de presentación personalizada arbitraria, a menos que ese formato tenga un analizador correspondiente y reglas bien definidas.