Skip to content

Stampare con pprint in Python

Python

In Python, puoi stampare oggetti come liste list e dizionari dict con il modulo pprint.

In questo articolo vengono descritti i seguenti contenuti.

  • Utilizzo di base di pprint
  • Specificare la larghezza di uscita (numero di caratteri):width
  • Specificare la profondità di uscita:depth
  • Specificare la larghezza del rientro:indent
  • Riduci le interruzioni di riga:compact
  • Converti in stringa:pprint.pformat()
  • Esempio: stampa graziosamente un elenco di elenchi

Il modulo textwrap è utile per avvolgere o troncare stringhe invece di elenchi o dizionari. Vedi il seguente articolo.

Nel codice di esempio, il modulo pprint viene importato come segue e l’elenco dei dizionari viene utilizzato come esempio. Il modulo pprint è incluso nella libreria standard, quindi non è necessario installarlo in aggiunta.

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

Utilizzo di base di pprint

La normale funzione print() gli elementi di un elenco o di un dizionario su una singola riga senza interruzioni di stampa.

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

Con pprint.pprint(), ogni elemento dell’elenco verrà suddiviso in una nuova riga come mostrato di seguito, facilitandone la lettura.

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 posizione dell’interruzione di riga è determinata dalle impostazioni degli argomenti di seguito.

Si noti che, come mostrato nell’esempio sopra, gli elementi del dizionario sono ordinati nell’ordine delle chiavi. Se il parametro sort_dicts, aggiunto in Python 3.8, è impostato su False (predefinito:True), the order of the dictionaries is kept, but in earlier versions, they are always sorted.

Se vuoi converti in una stringa str invece di emetterlo, usa pprint.pformat() seguita di seguito.

Specificare la larghezza di uscita (numero di caratteri):width

La larghezza di uscita (numero di caratteri) può essere specificata con larghezza.

La riga è interrotta per adattarsi al numero di caratteri specificato. Il valore predefinito è larghezza=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]}]

Se la larghezza è grande, non viene inserita nessuna nuova riga e l’output è lo stesso di 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]}]

Una riga è interrotta in corrispondenza di un elemento di una lista o di un dizionario, non tra la chiave e il valore di un dizionario, né nel mezzo di un numero. Pertanto, non sempre rientra nella larghezza del numero di caratteri dalla larghezza.

Nota che le stringhe possono essere suddivise in una nuova riga per ogni parola.

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

Specificare la profondità di uscita:depth

La profondità di uscita può essere specificata con la profondità. La profondità qui significa la profondità della nidificazione.

Gli elementi nidificati a una profondità maggiore del valore specificato vengono stampati con i puntini di sospensione ….

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': [...]}]

Il valore predefinito è profondità=Nessuno e vengono emessi tutti gli elementi.

È possibile specificare contemporaneamente larghezza e profondità. La profondità specifica la profondità della struttura dati, non il numero di righe. Le posizioni dell’interruzione di riga seleziona dal numero di caratteri specificato dalla larghezza.

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': [...]}]

Specificare la larghezza del rientro:indent

La larghezza del rientro può essere specificata con il rientro. Il valore predefinito è 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]}]

Riduci le interruzioni di riga:compact

Per prescrizione predefinita, tutti gli elementi di un elenco o di un dizionario interrompono le righe non rientrano nella larghezza.

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

Se compact è impostato su True, gli elementi che rientrano nella larghezza vengono stampati su una singola riga. È meglio usare compact=True per elenchi con molti elementi.

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

Nota che compact è stato aggiunto in Python 3.4, quindi non può essere utilizzato nelle versioni precedenti.

Converti in stringa:pprint.pformat()

Dizionari ed elenchi possono essere convertiti nella stringa con str(). In questo caso, vengono convertiti in una stringa di una riga senza newline, come nell’output di 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'>

Puoi usare pprint.pformat() per ottenere l’output di pprint.pprint() come stringa 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'>

I parametri di pprint.pformat() sono gli stessi di 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': [...]}]

Esempio: stampa graziosamente un elenco di elenchi

Una lista di liste è difficile da leggere con print(), quindi usa 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]]

Come accennato in precedenza, dove iniziare una nuova riga è determinato dal numero di caratteri dalla larghezza.

Se il numero di elementi è piccolo, si adatta alla larghezza di output predefinito width=80, quindi non c’è interruzione di riga.

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

Se viene specificata una larghezza appropriata, la linea verrà interrotta.

pprint.pprint(l_2d, width=20)
# [[0, 1, 2],
#  [3, 4, 5],
#  [6, 7, 8]]

Se vuoi ottenerlo come stringa, usa 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'>