Me gusta el módulo pprint en Python. Lo uso mucho para probar y depurar. Con frecuencia uso la opción de ancho para asegurarme de que la salida se ajuste bien dentro de la ventana de mi terminal.
Ha funcionado bien hasta que agregaron el nuevo tipo de diccionario ordenado en Python 2.7 (otra característica interesante que realmente me gusta). Si trato de imprimir con estilo un diccionario ordenado, no se ve bien. En lugar de tener cada par clave-valor en su propia línea, todo aparece en una línea larga, que se ajusta muchas veces y es difícil de leer.
¿Alguien aquí tiene una forma de hacer que se imprima bien, como los viejos diccionarios desordenados? Probablemente podría resolver algo, posiblemente usando el método PrettyPrinter.format, si dedico suficiente tiempo, pero me pregunto si alguien aquí ya conoce una solución.
ACTUALIZACIÓN: Presenté un informe de error para esto. Puede verlo en http://bugs.python.org/issue10592 .
fuente
Respuestas:
Como solución temporal, puede intentar realizar un volcado en formato JSON. Pierde algún tipo de información, pero se ve bien y mantiene el orden.
fuente
pprint.pprint(dict(data))
?pprint.pprint(dict(data))
funciona bien si no le importa el orden de las teclas. Personalmente, desearía que el__repr__
forOrderedDict
produjera un resultado como este pero conservara el orden de las claves.Lo siguiente funcionará si el orden de su OrderedDict es alfa, ya que pprint clasificará un dictado antes de imprimirlo.
fuente
dict
debería evitar el problema de que todo se coloque en una línea.Aquí hay otra respuesta que funciona anulando y usando la
pprint()
función de stock internamente. A diferencia del anterior , se manejaráOrderedDict
dentro de otro contenedor como alist
y también debería poder manejar cualquier argumento de palabra clave opcional dado; sin embargo, no tiene el mismo grado de control sobre la salida que el otro.Opera redirigiendo la salida de la función de stock a un búfer temporal y luego envuelve la palabra antes de enviarla al flujo de salida. Si bien el resultado final producido no es excepcionalmente bonito, es decente y puede ser "lo suficientemente bueno" para usarlo como solución.
Actualización 2.0
Simplificado mediante el uso de un
textwrap
módulo de biblioteca estándar y modificado para funcionar en Python 2 y 3.Salida de muestra:
»
{'john': 1, 'mary': 3, 'paul': 2}
»
OrderedDict([('john', 1), ('paul', 2),
('mary', 3)])
»
[OrderedDict([('john', 1), ('paul', 2),
('mary', 3)]), OrderedDict([('moe', 1),
('curly', 2), ('larry', 3)]),
OrderedDict([('weapons', 1), ('mass',
2), ('destruction', 3)])]
fuente
Para imprimir un dictado ordenado, p. Ej.
hago
Cuyos rendimientos
o
cuyos rendimientos
fuente
Aquí hay una forma que piratea la implementación de
pprint
.pprint
ordena las claves antes de imprimir, por lo que para preservar el orden, solo tenemos que hacer que las claves se ordenen de la manera que queramos.Tenga en cuenta que esto afecta la
items()
función. Por lo tanto, es posible que desee conservar y restaurar las funciones anuladas después de realizar el pprint.fuente
Aquí está mi enfoque para imprimir un OrderedDict
Si desea imprimir un diccionario bonito con claves en orden ordenado
fuente
python3
. Por favor verifiqueEsto es bastante burdo, pero solo necesitaba una forma de visualizar una estructura de datos formada por cualquier Mapeo e iteración arbitrarios y esto es lo que se me ocurrió antes de rendirme. Es recursivo, por lo que caerá bien a través de estructuras y listas anidadas. Usé las clases base abstractas Mapping e Iterable de colecciones para manejar casi cualquier cosa.
Apuntaba a una salida casi similar a yaml con un código de Python conciso, pero no lo logré.
y algunos datos de prueba usando OrderedDict y listas de OrderedDicts ... (sheesh Python necesita los literales OrderedDict tan mal ...)
produce el siguiente resultado:
Tuve algunas ideas sobre el uso de str.format () para una mejor alineación, pero no tenía ganas de profundizar en ello. Debería especificar dinámicamente los anchos de campo según el tipo de alineación que desee, lo que se volvería complicado o engorroso.
De todos modos, esto me muestra mis datos de una manera jerárquica legible, ¡así que eso funciona para mí!
fuente
Ahí tienes ^^
o
fuente
pprint_od()
función no está disponible - losfor key, item in od
resultados de la instrucción en unaValueError: too many values to unpack
y la única salida de sangría es la final" }"
y elkey, item
de laprint
necesidad de ser comunicado entre paréntesis. Ahí tienes ^^He probado este truco profano basado en parche de mono en python3.5 y funciona:
Haces que
pprint
utilice el resumen basado dict habitual y clasificación también desactivar durante la duración de la llamada de modo que no hay ninguna tecla en realidad clasifican para la impresión.fuente
pretty_print.py
como un módulo local y piratearlo (eliminar lasorted
llamada o lo que desee).A partir de Python 3.8:
pprint.PrettyPrinter
expone elsort_dicts
parámetro de palabra clave.Verdadero de forma predeterminada, establecerlo en Falso dejará el diccionario sin clasificar.
Saldrá:
Referencia: https://docs.python.org/3/library/pprint.html
fuente
El
pprint()
método simplemente invoca el__repr__()
método de las cosas en él, yOrderedDict
no parece hacer mucho en su método (o no tiene uno o algo).Aquí hay una solución económica que debería funcionar SI NO LE IMPORTA QUE EL PEDIDO SEA VISIBLE EN LA SALIDA DE IMPRESIÓN , lo que puede ser un gran si:
De hecho, me sorprende que no se conserve el orden ... bueno.
fuente
También puede usar esta simplificación de la respuesta kzh :
Conserva el orden y generará casi lo mismo que la respuesta webwurst ( imprimir a través de json dump ).
fuente
Para python <3.8 (por ejemplo, 3.6):
Parche mono
pprint
'ssorted
con el fin de evitar que la clasificación. Esto tendrá el beneficio de que todo funcione de forma recursiva también, y es más adecuado que lajson
opción para quien necesite usar, por ejemplo, elwidth
parámetro:Editar: limpieza
Para limpiar después de este sucio negocio, simplemente ejecute:
pprint.sorted = sorted
Para una solución realmente limpia, incluso puede usar un administrador de contexto:
fuente
Podría redefinir
pprint()
e interceptar las llamadas deOrderedDict
. He aquí una ilustración sencilla. Como está escrito, elOrderedDict
código de anulación ignora cualquier opcionalesstream
,indent
,width
, odepth
palabras clave que pueden haber sido pasadas, pero podría mejorarse para ponerlas en práctica. Por desgracia, esta técnica no se ocupa de ellos dentro de otro recipiente, tal como unalist
deOrderDict
'sfuente
Si los elementos del diccionario son todos de un tipo, puede usar la increíble biblioteca de manejo de datos
pandas
:o
fuente