HOWTO · Python

Convertir un dictionnaire en chaîne en Python

Ce tutoriel montre comment convertir un dictionnaire en chaîne et vice versa en Python

Sur cette page

Un dictionnaire peut être converti en chaîne pour l’affichage, la journalisation ou l’échange de données, mais ces usages nécessitent des formats différents. str() fournit la représentation Python, json.dumps() produit du texte JSON destiné aux échanges, pprint.pformat() crée une présentation lisible, et une boucle permet de définir un format d’affichage. Ces résultats sont des chaînes, mais ils ne préservent pas tous les mêmes types et ne garantissent pas tous que le dictionnaire d’origine puisse être reconstruit.

Choisir la bonne méthode pour convertir un dictionnaire en chaîne

Utilisez str() pour obtenir rapidement une représentation orientée Python, par exemple dans un message de débogage. Utilisez json.dumps() si un autre système attend du JSON et que vos valeurs appartiennent aux types pris en charge par JSON. Choisissez pprint.pformat() pour examiner plus facilement des données Python imbriquées. Créez une chaîne personnalisée si le résultat doit suivre une mise en forme précise, par exemple name: Alice, score: 9.

Ces formats de sérialisation ne sont pas interchangeables. Une chaîne d’affichage personnalisée et le résultat de str() peuvent être ambigus ou inadaptés à l’analyse par un autre programme. JSON prend en charge les objets, les tableaux, les chaînes, les nombres, les booléens et la valeur null ; les valeurs propres à Python, comme les tuples ou les ensembles, doivent être converties ou traitées autrement. pickle ne convertit pas non plus un dictionnaire en chaîne : sa sérialisation produit des octets, et le chargement de données pickle provenant d’une source non fiable peut exécuter du code malveillant.

Utiliser str() pour obtenir une représentation Python

str(dictionary) est une solution concise lorsqu’une représentation Python lisible suffit. Le résultat comprend les accolades du dictionnaire ainsi que les représentations Python de ses clés et de ses valeurs. La mise en forme exacte est destinée à Python et ne constitue pas un contrat de données interopérable entre langages : par exemple, Python utilise True et None, tandis que JSON utilise true et null.

Exécutez cet exemple :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

details = {"name": "Ada", "active": True}
text = str(details)
print(type(text).__name__)
print(text)
str
{'name': 'Ada', 'active': True}

Évitez d’attribuer le dictionnaire à une variable nommée dict, car cela masque le type intégré de Python. Gardez également à l’esprit que convertir un objet en texte ne rend pas ce texte réversible pour autant.

Sérialiser un dictionnaire en JSON avec json.dumps()

Pour obtenir une chaîne standard destinée à l’échange de données, utilisez json.dumps(). La fonction correspondante, json.loads(), analyse le texte JSON et le convertit en valeurs Python. Un aller-retour en JSON préserve les données compatibles avec JSON, mais pas tous les types Python : les tuples deviennent des tableaux, puis sont chargés comme des listes, et les clés de dictionnaire doivent appartenir aux types pris en charge par JSON. Par défaut, les caractères non ASCII sont échappés ; définissez ensure_ascii=False pour les afficher directement. Utilisez indent pour rendre le JSON plus lisible, ou sort_keys=True pour obtenir un ordre stable des clés lorsque cela vous convient.

Exécutez cet exemple :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

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

La valeur renvoyée par json.dumps() est une chaîne. Si un dictionnaire contient des valeurs que JSON ne peut pas encoder, prévoyez une stratégie de conversion adaptée ou choisissez un format conçu pour ces données ; ne supposez pas que JSON accepte tous les objets Python.

Mettre en forme un dictionnaire pour un affichage lisible avec pprint.pformat()

Utilisez pprint.pformat() pour obtenir une chaîne mise en forme au lieu d’afficher directement le résultat dans la console. Cette fonction est utile pour les données imbriquées, car elle peut répartir les structures longues sur plusieurs lignes. Le résultat reste une représentation d’affichage orientée Python, et non du JSON. Ses options permettent de régler la largeur, l’indentation, la profondeur et la compacité ; une limite de profondeur abrège les données imbriquées, de sorte que la chaîne peut ne pas afficher toutes les valeurs.

Exécutez cet exemple :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

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']}}

Utilisez la chaîne renvoyée là où vous en avez besoin, par exemple dans un message de journalisation. À l’inverse, pprint.pprint() écrit le texte mis en forme dans un flux ; cette fonction convient lorsque vous souhaitez afficher le résultat plutôt que le conserver dans une variable.

Construire une chaîne personnalisée avec une boucle

Un format personnalisé permet de choisir les séparateurs et les libellés. Une compréhension avec str.join() évite les concaténations répétées de chaînes et permet facilement de ne pas ajouter de séparateur final. Si un autre programme doit analyser le résultat, prévoyez comment traiter les valeurs qui contiennent le séparateur choisi : un format d’affichage simple ne définit pas automatiquement de règles d’échappement.

Exécutez cet exemple :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

scores = {"Ada": 9, "Lin": 8}
text = ", ".join(f"{name}: {score}" for name, score in scores.items())
print(text)
Ada: 9, Lin: 8

Cette méthode convient pour une ligne destinée à un lecteur. Si le résultat doit être échangé ou stocké en vue d’une analyse ultérieure, utilisez JSON ou définissez et implémentez un format doté de règles explicites de guillemets et d’échappement.

Convertir une chaîne en dictionnaire

Utilisez json.loads() pour analyser une chaîne JSON. Cette fonction accepte la syntaxe JSON, et non une sortie Python arbitraire de str(). Pour une chaîne contenant un littéral Python que vous contrôlez, ast.literal_eval() peut analyser les structures littérales prises en charge, dont un dictionnaire, sans évaluer d’expressions Python arbitraires. Ce n’est pas un analyseur généraliste ; ne l’utilisez pas avec des entrées non fiables, très volumineuses ou gourmandes en ressources. Vérifiez le type et le contenu du résultat selon les besoins de votre application.

Exécutez cet exemple :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

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}

Choisissez l’analyseur correspondant au format qui a produit la chaîne. Aucun des deux analyseurs ne peut reconstituer de manière fiable un dictionnaire à partir d’une chaîne d’affichage personnalisée quelconque, sauf si ce format dispose d’un analyseur correspondant et de règles clairement définies.