Python – Pretty Table

Pretty Table é uma biblioteca Python que ajuda a imprimir tabelas de modo simples e num formato não-gráfico que pode ser usado em programas de linha de comando, emails gerados automaticamente, etc. Vamos mostrar alguns exemplos de como fazer isso usando Pretty Table.

Importando as bibliotecas

from prettytable import PrettyTable
from prettytable import from_csv
from prettytable import from_html

Criando a tabela

# Cria a tabela
x = PrettyTable(["Nome da cidade", "UF", "População", "IDH-M", "Renda per Capita"])

# Alinha as colunas
x.align["Nome da cidade"] = "l"
x.align["UF"] = "l"
x.align["População"] = "r"
x.align["IDH-M"] = "r"
x.align["Renda per Capita"] = "r"

# Deixa um espaço entre a borda das colunas e o conteúdo (default)
x.padding_width = 1

Adicionando dados à tabela

Existem algumas forma de adicionar dados à tabela manualmente. A primeira delas é adicionar linha por linha.

x.add_row(["São Paulo","SP", 12106920, 0.805, 54358]) 
x.add_row(["Rio de Janeiro","RJ", 6520266, 0.799, 49527]) 
x.add_row(["Belo Horizonte", "MG", 2523794, 0.810, 35187]) 
x.add_row(["Porto Alegre", "RS", 1484941, 0.805, 46122]) 
x.add_row(["Salvador", "BA", 2953986, 0.759, 19812]) 
x.add_row(["Recife", "PE", 1633697, 0.772, 29701]) 
x.add_row(["Brasília", "DF", 3039444, 0.824, 73971])

Podemos também adicionar coluna por coluna.

x = PrettyTable()
x.add_column('Nome da cidade', ["São Paulo", "Rio de Janeiro", "Belo Horizonte", "Porto Alegre", "Salvador", "Recife", "Brasília"])
x.add_column('UF', ["SP", "RJ", "MG", "RS", "BA", "PE", "DF"])
x.add_column('População', [12106920, 6520266, 2523794, 1484941, 2953986, 1633697, 3039444])
x.add_column('IDH-M', [0.805, 0.799, 0.811, 0.805, 0.759, 0.772, .0824])
x.add_column('Renda per Capita', [54358, 49527, 35187, 46122, 19812, 29701, 73971])

Podemos também adicionar dados que já estejam armazenados em algum formato de tabela.

# Importando de um arquivo CSV
from prettytable import from_csv
ao = open("tabela_cidades.csv", "r")
x = from_csv(ao)
ao.close()

Nesse caso, a variável x é um objeto PrettyTable com a tabela completa extraída do CSV. A primeira linha do arquivo CSV é interpretada como sendo os nomes dos campos e é usada como o cabeçalho da tabela. Caso você queira especificar diferentes nomes para os campos, ou caso o arquivo CSV não contenha cabeçalho, você poderá determinar seus próprios nomes de campos através do argumento “field_names”.

É possível também extrair dados de uma string de código HTML.

from prettytable import from_html 
x = from_html(string_html)

A variável x será uma lista de objetos PrettyTable. Haverá uma tabela PrettyTable para cada <table> no código HTML. Se estiver seguro de que o código HTML contém apenas uma tabela, ao invés de usar a função from_html para obter a lista, você pode usar a função from_html_one. Essa função irá retornar um único objeto PrettyTable. Todavia, caso o código HTML contenha mais de uma tabela, a função from_html_one irá retornar uma exceção.

Imprimindo a tabela

print(x)

Output:

Selecionando sub-conjuntos de dados

Caso queira apenas exibir uma parte dos campos da tabela, você pode selecioná-los e gerar uma sub-tabela.

a = x.get_string(fields=["Nome da cidade", "População"])
print(a)

Output:

Você pode também selecionar quais linhas quer exibir.

a = x.get_string(start=0, end=3)
print(a)

Resultado:

Você pode ainda criar um novo objeto PrettyTable apenas com os dados que interessam.

tabela_nova = x[0:3]
print(tabela_nova)

Resultado:

Ordenando tabelas

Você pode ordenar as linhas da tabela por qualquer coluna.

print(x.get_string(sortby="Nome da cidade"))

Resultado:

E podemos ordenar de modo reverso também.

print(x.get_string(sortby="Renda per Capita", reversesort=True))

Resultado:

Controlando o estilo das tabelas

Originalmente, PrettyTable produz tabelas ASCII que se parecem com as produzidas em linha de comando para tabelas SQL. Todavia, PrettyTable pode imprimir em outros formatos também. O método set_style permite usar alguns formatos mais comuns. E caso você queira experimentar outros tipos de formatos, também é possível.

Estilos padrão de uma tabela

Você pode definir o estilo da sua tabela usando o método set_style antes mesmo de chamar get_string.

from prettytable import MSWORD_FRIENDLY
x.set_style(MSWORD_FRIENDLY)
print(x)

Resultado:

Além de MSWORD_FRIENDLY, PrettyTable tem outros dois estilos padrão:

  • DEFAULT – Estilo padrão, usado para desfazer mudanças de estilo
  • PLAIN_COLUMNS – Estilo sem bordas
from prettytable import PLAIN_COLUMNS
x.set_style(PLAIN_COLUMNS)
print(x)

Resultado:

Alterando o estilo de uma tabela

PrettyTable permite você controlar vários aspectos de como uma tabela é formada e exibida. Você tem flexibilidade para escolher dentre as opções disponíveis. As opções são:

  • border – Determina se há ou não borda. Valor booleano: True ou False
  • header – Determina se a primeira linha apresenta ou não os nomes dos campos. Valor booleano: True ou False
  • header_style – Determina se a primeira linha vem em letras maiúsculas ou não. Valores permitidos:
    • cap – primeira letra é maiúscula
    • upper – todas maiúsculas
    • lower – todas minúsculas
    • None – segue o original
  • hrules – Controla a impressão de réguas horizontais após cada linha. Valore permitidos:
    • FRAME
    • ALL
    • None
  • vrules – Controla a impressão de réguas verticais entre as colunas. Valore permitidos:
    • FRAME
    • ALL
    • None
  • align – Controla o alinhamento horizontal. Valores permitidos:
    • None
    • l – esquerda
    • c – centro
    • r – direita
  • valign – Controla o alinhamento vertical. Valores permitidos:
    • None
    • t – topo
    • m – meio
    • b – fundo
  • int_format – Controla o formato de números inteiros.
  • float_format – Controla o formato de números flutuantes.
  • padding_width – Determina o número de espaços nos lados de cada coluna
  • left_padding_width – Determina o número de espaços no lado esquerdo de cada coluna
  • right_padding_width – Determina o número de espaços no lado direito de cada coluna
  • vertical_char – Caracter único usado nas linhas verticais. O padrão é |
  • horizontal_char – Caracter único usado nas linhas horizontais. O padrão é –
  • junction_char – Caracter único usado nas junções. O padrão é +

Exemplo de alterações de estilo.

x.header_style = 'upper'
x.horizontal_char = '_'
x.vertical_char = '!'
x.junction_char = '*'
print(x)

Resultado:


Veja também: