J'essaie de créer une belle liste de colonnes en python à utiliser avec les outils d'administration en ligne de commande que je crée.
Fondamentalement, je veux une liste comme:
[['a', 'b', 'c'], ['aaaaaaaaaa', 'b', 'c'], ['a', 'bbbbbbbbbb', 'c']]
Se transformer en:
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
L'utilisation d'onglets simples ne fera pas l'affaire ici car je ne connais pas les données les plus longues de chaque ligne.
C'est le même comportement que 'column -t' sous 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 cherché diverses bibliothèques python pour faire cela mais je ne trouve rien d'utile.
Réponses:
Cela permet de calculer la plus longue entrée de données pour déterminer la largeur de la colonne, puis de l'utiliser
.ljust()
pour ajouter le remplissage nécessaire lors de l'impression de chaque colonne.la source
longest
est trompeur car ce n'est pas l'élément le plus long mais la longueur_max. BTW la plus longue pourrait être prise avec quelque chose comme:max((w for sub in data for w in sub), key=len)
. [PS Je n'étais pas celui qui a voté contre]max((w for ...), key=len)
vous donne l'entrée la plus longue et vous devrez ensuite refaire une courselen
. Je n'ai pas pu décider lequel était clair, alors je suis resté avec le premier. Bon point sur le nom trompeur de var. Modifié.max(len(x) for sub in data for x in sub)
cela ne crée pas non plus de listes inutiles.column -t
cas.Depuis Python 2.6+, vous pouvez utiliser une chaîne de format de la manière suivante pour définir les colonnes sur un minimum de 20 caractères et aligner le texte à droite.
Production:
la source
{: >20}
pour afficher plus de champsJe suis venu ici avec les mêmes exigences, mais les réponses de @lvc et @ Preet semblent plus en ligne avec ce qui
column -t
produit dans ces colonnes ont des largeurs différentes:la source
map(len, map(str, col))
.C'est un peu tard à la fête, et une prise sans vergogne pour un paquet que j'ai écrit, mais vous pouvez également consulter le paquet Columnar .
Il prend une liste de listes d'entrées et une liste d'en-têtes et génère une chaîne au format tableau. Cet extrait de code crée une table de type docker:
Ou vous pouvez devenir un peu plus chic avec des couleurs et des bordures.
Pour en savoir plus sur l'algorithme de dimensionnement des colonnes et voir le reste de l'API, vous pouvez consulter le lien ci-dessus ou voir le dépôt Columnar GitHub
la source
Vous devez le faire avec 2 passes:
str.ljust()
etstr.rjust()
la source
Transposer les colonnes comme ça est un travail pour zip:
Pour trouver la longueur requise de chaque colonne, vous pouvez utiliser
max
:Que vous pouvez utiliser, avec un remplissage approprié, pour construire des chaînes à transmettre
print
:la source
Pour obtenir des tables plus chics comme
vous pouvez utiliser cette recette Python :
La page de recettes Python contient quelques améliorations.
la source
pandas
solution basée sur la création de dataframe:Pour supprimer les valeurs d'index et d'en-tête pour créer la sortie que vous voulez, vous pouvez utiliser la
to_string
méthode:la source
Scolp est une nouvelle bibliothèque qui vous permet d'imprimer facilement des données de colonne en continu tout en ajustant automatiquement la largeur de la colonne.
(Avertissement: je suis l'auteur)
la source
Cela définit les largeurs de colonne indépendantes et les mieux adaptées en fonction de la métrique maximale utilisée dans d'autres réponses.
la source
Pour les paresseux
qui utilisent Python 3. * et Pandas / Geopandas ; universel simple approche en classe (pour le script « normal » juste enlever l' auto ):
Fonction coloriser:
Entête:
puis les données de la trame de données Pandas / Geopandas:
Signification de
{0:<30} {1:>35} {2:>35} {3:>35} {4:>20} {5:>20}
:0, 1, 2, 3, 4, 5
-> colonnes, il y en a 6 au total dans ce cas30, 35, 20
-> largeur de la colonne (notez que vous devrez ajouter une longueur de\033[96m
- ceci pour Python est également une chaîne), expérimentez simplement :)>, <
-> justifier: droite, gauche (il y a aussi=
pour le remplissage avec des zéros)Résultat:
la source
Une légère variation par rapport à une réponse précédente (je n'ai pas assez de représentants pour la commenter). La bibliothèque de formats vous permet de spécifier la largeur et l'alignement d'un élément, mais pas son point de départ, c'est-à-dire que vous pouvez dire "avoir 20 colonnes de large" mais pas "commencer dans la colonne 20". Ce qui conduit à ce problème:
Production
La réponse est bien sûr de formater les chaînes littérales également, ce qui se combine un peu bizarrement avec le format:
Production
la source
J'ai trouvé cette réponse super utile et élégante, à l'origine d' ici :
Production
la source
Voici une variante de la réponse de Shawn Chin. La largeur est fixe par colonne, pas sur toutes les colonnes. Il y a aussi une bordure sous la première ligne et entre les colonnes. ( La bibliothèque icontract est utilisée pour appliquer les contrats.)
Voici un exemple:
la source
mise à jour de la recette de fantaisie @Franck Dernoncourt pour être conforme à Python 3 et PEP8
la source
Je me rends compte que cette question est ancienne mais je n'ai pas compris la réponse d'Antak et je ne voulais pas utiliser de bibliothèque, j'ai donc lancé ma propre solution.
La solution suppose que les enregistrements sont un tableau 2D, les enregistrements ont tous la même longueur et que les champs sont tous des chaînes.
la source