Créer une belle colonne de sortie en python
Je suis en train de créer une belle colonne de la liste en python pour une utilisation avec des outils d'administration en ligne de commande que je crée.
Bref, je veux une liste comme:
[['a', 'b', 'c'], ['aaaaaaaaaa', 'b', 'c'], ['a', 'bbbbbbbbbb', 'c']]
À son tour en:
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
À l'aide de la plaine onglets habitude de faire le tour ici car je ne sais pas la plus longue de données dans chaque ligne.
C'est le même comportement que colonne '- t' dans Linux..
$ echo -e "a b c\naaaaaaaaaa b c\na bbbbbbbbbb c"
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
$ echo -e "a b c\naaaaaaaaaa b c\na bbbbbbbbbb c" | column -t
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
J'ai regardé autour de diverses bibliothèques python pour ce faire, mais ne peut pas trouver quelque chose d'utile.
- que penser de l'utilisation de ncurses?
- En utilisant ncurses est un peu exagéré pour l'affichage de la petite ~10 lignes de renseignements que je veux.. Mais nous sommes en utilisant ncurses pour d'autres trucs.
InformationsquelleAutor xeor | 2012-04-03
Vous devez vous connecter pour publier un commentaire.
Ce que ce n'est calculer le plus long de saisie de données pour déterminer la largeur de la colonne, puis utilisez
.ljust()
pour ajouter le padding nécessaire lors de l'impression de chaque colonne.longest
est trompeur, car ce n'est pas la plus longue de l'élément, mais l'max_length. BTW, la plus longue pourrait être pris avec quelque chose comme:max((w for sub in data for w in sub), key=len)
. [P. S. je n'étais pas le seul à downvote]max((w for ...), key=len)
vous donne l'entrée la plus longue et vous aurez alors besoin de faire une courselen
de nouveau. Ne pouvais pas décider ce qui était clair, donc j'ai collé avec la première. Bon point sur la trompeuse var nom. Changé.max(len(x) for sub in data for x in sub)
, qui permet également de ne pas construire des listes inutiles.itertools
exemple remplacé avec le générateur d'expression, tel que suggéré par @RikPoggi.column -t
n'.Depuis la version 2.6 de Python+, vous pouvez utiliser un chaîne de format de la façon suivante pour définir les colonnes à un minimum de 20 caractères et d'aligner le texte à droite.
De sortie:
{: >20}
pour afficher plus de champsJe suis venu ici avec les mêmes exigences, mais @lvc et @Preet réponses semble plus en ligne avec ce que
column -t
produit dans les colonnes de largeurs différentes:map(len, map(str, col))
.Vous avez à faire cela avec 2 passes:
str.ljust()
etstr.rjust()
La transposition de l'colonnes, comme c'est un travail pour zip:
Pour trouver la longueur requise de chaque colonne, vous pouvez utiliser
max
:Que vous pouvez utiliser, adapté de rembourrage, de construire des chaînes de passer à
print
:Pour obtenir de l'amateur de tableaux comme
vous pouvez utiliser cette Python recette:
La Python recette de la page contient quelques améliorations sur elle.
pandas
solution basée sur la création d'dataframe:Pour supprimer les index et les valeurs d'en-tête pour créer ce que vous voulez, vous pouvez utiliser
to_string
méthode:C'est un peu en retard à la fête, et un plug sans vergogne pour un colis que j'ai écrit, mais vous pouvez également consulter le Colonnaire paquet.
Il prend une liste de listes d'entrée et une liste d'en-têtes et les sorties d'un tableau de chaîne au format. Cet extrait de code crée un menu fixe-esque de la table:
Ou vous pouvez obtenir un peu plus sophistiqué avec des couleurs et des frontières.
Pour en savoir plus sur la colonne de la taille de l'algorithme et de voir le reste de l'API, vous pouvez consulter le lien ci-dessus ou voir le Colonnes Dépôt GitHub
Je me rends compte que cette question est vieux, mais je ne comprenais pas Antak de réponse et je ne voulais pas utiliser une bibliothèque donc j'ai roulé ma propre solution.
Solution suppose records est un tableau 2D, les enregistrements sont tous de la même longueur, et que les champs sont toutes les chaînes.
J'ai trouvé cette réponse super utile et élégant, à l'origine de ici:
Sortie
Ici est une variante de la Shawn Menton de la réponse. La largeur est fixée par colonne, et non pas sur toutes les colonnes. Il y a aussi une frontière au-dessous de la première ligne et entre les colonnes. (icontract bibliothèque est utilisée pour faire respecter les contrats.)
Voici un exemple:
Scolp est une nouvelle bibliothèque qui vous permet de pretty print streaming colonne des données facilement tandis que l'auto-réglage de la largeur de la colonne.
(Disclaimer: je suis l'auteur)
mise à jour @Franck Dernoncourt fantaisie recette à python 3 et PEP8 conforme
Ce jeux indépendants, meilleur ajustement des largeurs de colonne basée sur le max-métrique utilisée dans d'autres réponses.