Estou tentando criar uma boa lista de colunas em python para uso com ferramentas de administração de linha de comando que eu crio.
Basicamente, quero uma lista como:
[['a', 'b', 'c'], ['aaaaaaaaaa', 'b', 'c'], ['a', 'bbbbbbbbbb', 'c']]
Para se transformar em:
a b c
aaaaaaaaaa b c
a bbbbbbbbbb c
Usar guias simples não resolverá aqui porque não conheço os dados mais longos de cada linha.
Este é o mesmo comportamento de 'column -t' no 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
Procurei várias bibliotecas Python para fazer isso, mas não consigo encontrar nada útil.
Respostas:
O que isso faz é calcular a entrada de dados mais longa para determinar a largura da coluna e, em seguida, usar
.ljust()
para adicionar o preenchimento necessário ao imprimir cada coluna.fonte
longest
é enganoso porque não é o elemento mais longo, mas o max_length. BTW o mais longo poderia ser tomado com algo como:max((w for sub in data for w in sub), key=len)
. [PS Eu não fui o único a votar negativamente]max((w for ...), key=len)
fornece a entrada mais longa e você precisa fazer uma corridalen
novamente. Não consegui decidir o que estava claro, então continuei com o primeiro. Bom ponto sobre o nome var enganoso. Alterado.max(len(x) for sub in data for x in sub)
isso também não cria listas desnecessárias.column -t
.Desde o Python 2.6+, você pode usar uma string de formato da seguinte maneira para definir as colunas com um mínimo de 20 caracteres e alinhar o texto à direita.
Resultado:
fonte
{: >20}
para exibir mais camposEu vim aqui com os mesmos requisitos, mas as respostas de @lvc e @ Preet parecem mais alinhadas com o que
column -t
produz nas colunas de larguras diferentes:fonte
map(len, map(str, col))
.É um pouco tarde para a festa e um plug desavergonhado para um pacote que escrevi, mas você também pode verificar o pacote Colunar .
Ele pega uma lista de listas de entrada e uma lista de cabeçalhos e produz uma string formatada em tabela. Este snippet cria uma tabela docker-esque:
Ou você pode ficar um pouco mais sofisticado com cores e bordas.
Para ler mais sobre o algoritmo de dimensionamento de coluna e ver o resto da API, você pode verificar o link acima ou ver o repositório Colunar do GitHub
fonte
Você tem que fazer isso com 2 passes:
str.ljust()
estr.rjust()
fonte
Transpor as colunas dessa forma é um trabalho para o zip:
Para encontrar o comprimento necessário de cada coluna, você pode usar
max
:Que você pode usar, com preenchimento adequado, para construir strings para passar para
print
:fonte
Para obter mesas mais sofisticadas como
você pode usar esta receita Python :
A página de receitas do Python contém algumas melhorias.
fonte
pandas
solução baseada na criação de dataframe:Para remover valores de índice e cabeçalho para criar a saída que você deseja, você pode usar o
to_string
método:fonte
Scolp é uma nova biblioteca que permite que você imprima facilmente dados colunares de streaming enquanto ajusta automaticamente a largura da coluna.
(Aviso: eu sou o autor)
fonte
Isso define larguras de coluna independentes e de melhor ajuste com base na métrica máxima usada em outras respostas.
fonte
Para pessoas preguiçosas
que usam Python 3. * e Pandas / Geopandas ; abordagem universal simples em classe (para script 'normal', basta remover a si mesmo ):
Função colorize:
Cabeçalho:
e, em seguida, dados do dataframe Pandas / Geopandas:
Significado de
{0:<30} {1:>35} {2:>35} {3:>35} {4:>20} {5:>20}
:0, 1, 2, 3, 4, 5
-> colunas, há 6 no total neste caso30, 35, 20
-> largura da coluna (observe que você terá que adicionar comprimento de\033[96m
- isso para Python também é uma string), apenas experimente :)>, <
-> justificar: direita, esquerda (também existe=
para preencher com zeros)Resultado:
fonte
Uma ligeira variação em uma resposta anterior (não tenho representantes suficientes para comentar). A biblioteca de formatos permite que você especifique a largura e o alinhamento de um elemento, mas não onde ele começa, ou seja, você pode dizer "ter 20 colunas de largura", mas não "começar na coluna 20". O que leva a este problema:
Resultado
A resposta, claro, é formatar as strings literais também, o que combina de maneira um tanto estranha com o formato:
Resultado
fonte
Achei esta resposta muito útil e elegante, originalmente daqui :
Resultado
fonte
Aqui está uma variação da resposta de Shawn Chin. A largura é fixa por coluna, não em todas as colunas. Também há uma borda abaixo da primeira linha e entre as colunas. (a biblioteca icontract é usada para fazer cumprir os contratos.)
Aqui está um exemplo:
fonte
atualizou a receita extravagante de @Franck Dernoncourt para ser compatível com Python 3 e PEP8
fonte
Sei que essa pergunta é antiga, mas não entendi a resposta de Antak e não queria usar uma biblioteca, então lancei minha própria solução.
A solução assume que os registros são uma matriz 2D, os registros têm todos o mesmo comprimento e os campos são todos strings.
fonte