
En Python, vous pouvez joliment imprimer des objets tels que des listes de listes et des dictionnaires dict avec le module pprint.
Cet article décrit le contenu suivant.
- Utilisation de base de pprint
 - Spécifiez la largeur de sortie (nombre de caractères) :
width - Spécifiez la profondeur de sortie :
depth - Spécifiez la largeur du retrait :
indent - Réduire les sauts de ligne :
compact - Convertir en chaîne :
pprint.pformat() - Exemple : joli imprimer une liste de listes
 
Le module textwrap est utile pour envelopper ou tronquer de longues chaînes au lieu de listes ou de dictionnaires. Voir l’article suivant.
Dans l’exemple de code, le module pprint est importé comme suit et la liste des dictionnaires est utilisée comme exemple. Le module pprint est inclus dans la bibliothèque standard, il n’est donc pas nécessaire de l’installer en plus.
import pprint
l = [{'Name': 'Alice XXX', 'Age': 40, 'Points': [80, 20]},
     {'Name': 'Bob YYY', 'Age': 20, 'Points': [90, 10]},
     {'Name': 'Charlie ZZZ', 'Age': 30, 'Points': [70, 30]}]
Utilisation de base de pprint
La fonction normale print() imprime les éléments d’une liste ou d’un dictionnaire sur une seule ligne sans aucun saut de ligne.
print(l)
# [{'Name': 'Alice XXX', 'Age': 40, 'Points': [80, 20]}, {'Name': 'Bob YYY', 'Age': 20, 'Points': [90, 10]}, {'Name': 'Charlie ZZZ', 'Age': 30, 'Points': [70, 30]}]
Avec pprint.pprint(), chaque élément de la liste sera divisé en une nouvelle ligne comme indiqué ci-dessous, ce qui facilitera la lecture.
pprint.pprint(l)
# [{'Age': 40, 'Name': 'Alice XXX', 'Points': [80, 20]},
#  {'Age': 20, 'Name': 'Bob YYY', 'Points': [90, 10]},
#  {'Age': 30, 'Name': 'Charlie ZZZ', 'Points': [70, 30]}]
La position du saut de ligne est déterminée par les paramètres d’argument décrits ci-dessous.
Notez que, comme le montre l’exemple ci-dessus, les éléments du dictionnaire sont triés dans l’ordre des clés. Si le paramètre sort_dicts, ajouté dans Python 3.8, est défini sur False (par défaut :True), the order of the dictionaries is kept, but in earlier versions, they are always sorted.
Si vous souhaitez le convertir en une chaîne str au lieu de l’afficher, utilisez pprint.pformat() décrit ci-dessous.
Spécifiez la largeur de sortie (nombre de caractères) :width
La largeur de sortie (nombre de caractères) peut être spécifiée avec width.
La ligne est interrompue pour s’adapter au nombre de caractères spécifié. La valeur par défaut est largeur=80.
pprint.pprint(l, width=40)
# [{'Age': 40,
#   'Name': 'Alice XXX',
#   'Points': [80, 20]},
#  {'Age': 20,
#   'Name': 'Bob YYY',
#   'Points': [90, 10]},
#  {'Age': 30,
#   'Name': 'Charlie ZZZ',
#   'Points': [70, 30]}]
Si width est grand, aucune nouvelle ligne n’est insérée et la sortie est la même que print().
pprint.pprint(l, width=200)
# [{'Age': 40, 'Name': 'Alice XXX', 'Points': [80, 20]}, {'Age': 20, 'Name': 'Bob YYY', 'Points': [90, 10]}, {'Age': 30, 'Name': 'Charlie ZZZ', 'Points': [70, 30]}]
Une ligne est coupée à un élément d’une liste ou d’un dictionnaire, pas entre la clé et la valeur d’un dictionnaire, ni au milieu d’un nombre. Par conséquent, il ne rentre pas toujours dans la largeur du nombre de caractères spécifié par largeur.
Notez que les chaînes peuvent être divisées en une nouvelle ligne pour chaque mot.
pprint.pprint(l, width=1)
# [{'Age': 40,
#   'Name': 'Alice '
#           'XXX',
#   'Points': [80,
#              20]},
#  {'Age': 20,
#   'Name': 'Bob '
#           'YYY',
#   'Points': [90,
#              10]},
#  {'Age': 30,
#   'Name': 'Charlie '
#           'ZZZ',
#   'Points': [70,
#              30]}]
Spécifiez la profondeur de sortie :depth
La profondeur de sortie peut être spécifiée avec depth. La profondeur signifie ici la profondeur d’imbrication.
Les éléments imbriqués plus profondément que la valeur spécifiée sont imprimés avec les points de suspension ….
pprint.pprint(l, depth=1)
# [{...}, {...}, {...}]
pprint.pprint(l, depth=2)
# [{'Age': 40, 'Name': 'Alice XXX', 'Points': [...]},
#  {'Age': 20, 'Name': 'Bob YYY', 'Points': [...]},
#  {'Age': 30, 'Name': 'Charlie ZZZ', 'Points': [...]}]
La valeur par défaut est depth=None, et tous les éléments sont sortis.
Vous pouvez spécifier à la fois la largeur et la profondeur. La profondeur spécifie la profondeur de la structure de données, pas le nombre de lignes. Les positions des sauts de ligne dépendent du nombre de caractères spécifié par largeur.
pprint.pprint(l, depth=2, width=40)
# [{'Age': 40,
#   'Name': 'Alice XXX',
#   'Points': [...]},
#  {'Age': 20,
#   'Name': 'Bob YYY',
#   'Points': [...]},
#  {'Age': 30,
#   'Name': 'Charlie ZZZ',
#   'Points': [...]}]
Spécifiez la largeur du retrait :indent
La largeur du retrait peut être spécifiée avec indent. La valeur par défaut est indent=1.
pprint.pprint(l, indent=4, width=4)
# [   {   'Age': 40,
#         'Name': 'Alice '
#                 'XXX',
#         'Points': [   80,
#                       20]},
#     {   'Age': 20,
#         'Name': 'Bob '
#                 'YYY',
#         'Points': [   90,
#                       10]},
#     {   'Age': 30,
#         'Name': 'Charlie '
#                 'ZZZ',
#         'Points': [   70,
#                       30]}]
Réduire les sauts de ligne :compact
Par défaut, tous les éléments d’une liste ou d’un dictionnaire coupent les lignes s’ils ne tiennent pas dans la largeur.
l_long = [list(range(10)), list(range(100, 110))]
print(l_long)
# [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [100, 101, 102, 103, 104, 105, 106, 107, 108, 109]]
pprint.pprint(l_long, width=40)
# [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
#  [100,
#   101,
#   102,
#   103,
#   104,
#   105,
#   106,
#   107,
#   108,
#   109]]
Si compact est défini sur True, les éléments qui tiennent dans la largeur sont imprimés sur une seule ligne. Il est préférable d’utiliser compact=True pour les listes contenant de nombreux éléments.
pprint.pprint(l_long, width=40, compact=True)
# [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
#  [100, 101, 102, 103, 104, 105, 106,
#   107, 108, 109]]
Notez que compact a été ajouté dans Python 3.4, il ne peut donc pas être utilisé dans les versions antérieures.
Convertir en chaîne :pprint.pformat()
Les dictionnaires et les listes peuvent être convertis en chaîne avec str(). Dans ce cas, ils sont convertis en une chaîne d’une ligne sans retour à la ligne, comme dans la sortie de print().
s_normal = str(l)
print(s_normal)
# [{'Name': 'Alice XXX', 'Age': 40, 'Points': [80, 20]}, {'Name': 'Bob YYY', 'Age': 20, 'Points': [90, 10]}, {'Name': 'Charlie ZZZ', 'Age': 30, 'Points': [70, 30]}]
print(type(s_normal))
# <class 'str'>
Vous pouvez utiliser pprint.pformat() pour obtenir la sortie de pprint.pprint() sous la forme de chaîne str.
s_pp = pprint.pformat(l)
print(s_pp)
# [{'Age': 40, 'Name': 'Alice XXX', 'Points': [80, 20]},
#  {'Age': 20, 'Name': 'Bob YYY', 'Points': [90, 10]},
#  {'Age': 30, 'Name': 'Charlie ZZZ', 'Points': [70, 30]}]
print(type(s_pp))
# <class 'str'>
Les paramètres de pprint.pformat() sont les mêmes que pprint.pprint().
s_pp = pprint.pformat(l, depth=2, width=40, indent=2)
print(s_pp)
# [ { 'Age': 40,
#     'Name': 'Alice XXX',
#     'Points': [...]},
#   { 'Age': 20,
#     'Name': 'Bob YYY',
#     'Points': [...]},
#   { 'Age': 30,
#     'Name': 'Charlie ZZZ',
#     'Points': [...]}]
Exemple : joli imprimer une liste de listes
Une liste de listes est difficile à lire avec print(), utilisez donc pprint.pprint().
l_2d = [list(range(10)), list(range(10)), list(range(10))]
print(l_2d)
# [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
pprint.pprint(l_2d)
# [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
#  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
#  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
Comme mentionné ci-dessus, l’endroit où commencer une nouvelle ligne est déterminé par le nombre de caractères spécifié par largeur.
Si le nombre d’éléments est petit, il correspond à la largeur de sortie par défaut width=80, il n’y a donc pas de saut de ligne.
l_2d = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
print(l_2d)
# [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
pprint.pprint(l_2d)
# [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
Si une largeur appropriée est spécifiée, la ligne sera brisée.
pprint.pprint(l_2d, width=20)
# [[0, 1, 2],
#  [3, 4, 5],
#  [6, 7, 8]]
Si vous voulez l’obtenir sous forme de chaîne, utilisez pprint.pformat().
s = pprint.pformat(l_2d, width=20)
print(s)
# [[0, 1, 2],
#  [3, 4, 5],
#  [6, 7, 8]]
print(type(s))
# <class 'str'>
