sábado, 17 de abril de 2010

Criando ficheiros Excel em Python - pyExcelerator

Se alguma vez quiseste exportar uma tabela de dados a partir de um script Python sabes que mexer com CSV é bastante complicado.

Para nos salvar, existe o módulo pyExcelerator, que permite exportar com imensa facilidade tabelas de dados em formato .xls, o padrão do MS Office Excel, sem necessidade do Office nem sequer de Windows OS.
Como o módulo não tem uma documentação por aí além, decidi dar uma ajuda ao pessoal e deixar aqui uns comandos básicos.

O básico do pyExcelerator:
Inicialização (comandos obrigatórios):
# importação do módulo
from pyExcelerator import *
# criação de um workbook, a base de trabalho
wb = Workbook()
# criação de uma sheet para o workbook, que está vazio
ws1 = wb.add_sheet("sheet1")

Fontes (comandos opcionais; default Arial 10px):
# criação de um objecto fonte
font1 = Font()
# indicação do tipo de letra
font1.name = "Arial"
# bold, itálico, sublinhado e cortado
font1.bold = True
font1.italic = True
font1.underline = True
font1.struck_out = True
# mudar a cor para azul
font1.colour_index = 4
# cores disponíveis: 1-Branco; 2-Vermelho; 3-Verde; 4-Azul; 5-Amarelo; 6-Magenta; 7-Ciano

Estilos (opcional):
# estilo de fonte. Este comando é necessário para alterar a formatação da fonte. Se não for preciso fazê-lo, pode ser omitido
font1_style = XFStyle()
# associação da fonte ao estilo
font1_style.font = font1

Alinhamento de objectos dentro de células (comandos opcionais. Necessário um estilo de fonte):
# alinhamento ao centro da célula
align1 = Alignment()
align1.horz = Alignment.HORZ_CENTER
align1.vert = Alignment.VERT_CENTER
# outros tipos de alinhamento: HORZ_LEFT; HORZ_RIGHT; VERT_TOP; VERT_BOTTOM
# associação do alinhamento ao estilo
font1_style.alignment = align1

Formatação de números (opcional. Necessário um estilo de fonte):
# associando a formatação ao estilo
font1_style.num_format_str = "0.00E+00"
# outros tipos de formatação na tabela abaixo, adaptada de uma já existente

TipoExemplo
general-1278.91
0-1279
0.00-1278.91
#,##0-1,279
#,##0.00-1,278.91
0%-127891%
0.00%-127890.78%
0.00E+00-1.28E+03
# ?/?-1278 8/9
# ??/??-1278 69/76
M/D/YY29/06/1896
D-MMM-YY29-Jun-96
D-MMM29-Jun
MMM-YYJun-96
h:mm AM/PM2:12 AM
h:mm:ss AM/PM2:12:46 AM
h:mm02:12
h:mm:ss02:12:46
M/D/YY h:mm29/06/1896 02:12
mm:ss.012:46.1

Escrever os dados (obviamente obrigatório):
# escrever a palavra '"python" na célula (0,2)
ws1.write(0,2,"python")
# criar o ficheiro .xls com o nome "python". Este comando costuma ser o último
wb.save("python.xls")

E pronts, é isto. Extremamente simples e eficaz. :)

quinta-feira, 15 de abril de 2010

The Collatz Conjecture Buster (not) v1.1

Boas,
escrevi um pequeno script com o intuito de destruir a Conjectura de Collatz, o que é impossível de ser conseguido.


"O que é a Conjectura de Collatz", perguntas tu.

Imagina um número positivo inteiro maior do que 2: n
Se n for par, divide n por 2.
Se n for ímpar, multiplica n por 3 e adiciona 1.

Tomemos como exemplo o número 5:
5 é ímpar, logo 3*5+1 = 16
16 é par, logo 16/2 = 8
8 é par, logo 8/2 = 4
4 é par, logo 4/2 = 2
2 é par, logo 2/2 = 1
1.

De acordo com Lothar Collatz, repetindo este processo vais eventualmente chegar até ao número 1. Sempre. Qualquer que seja o n que escolhas.
Isto é, claramente, óbvio. Mas será mesmo assim? Não haverá um número n que negue esta conjectura?
Quem sabe... Como isto me fascinou e porque me queria divertir um pedaço, decidi escrever este pequeno programa.



Este programa/script, escrito em Python, faz os cálculos necessários para um número n ou um conjunto de números n (por exemplo, de 10 a 1000000) consoante a sua paridade ou imparidade, devolvendo, posterior e opcionalmente, uma lista com todos os n trabalhados e o número de repetições de cálculos que têm de ser feitas até se chegar a 1.
Na versão 1.1, esta, adicionei a opção de exportar automaticamente a tal lista para um ficheiro .xls, formato padrão do MS Office Excel.


Sendo open-source, aqui vai o código. Sê livre de testar, alterar e melhorar o que quiseres. :)
Nota: requer o módulo pyExcelerator para a exportação em .xls.