Archives for Python category
Posted on jul 30, 2010 under Python |
Jstree é uma biblioteca javascript, que cria uma árvore de navegação ou visualização semelhante a do windows explorer. Nesse tutorial irei mostrar com criar uma árvore integrada com uma aplicação utilizando o framework Django, ajax, json e além disso no código fonte do exemplo mostra como usar layouts css com django.
Primeiro passo é adicionar as bibliotecas JQuery e JSTree na página.
Inserir uma função JavaScript e uma div no corpo da página, nesse caso chamei a div de tree.
Após criar uma função dentro do arquivo views.py, que irá converter o modelo Estado em um objeto json no formato exigido pela biblioteca jstree.
def jstreeJson(request):
estados = Estado.objects.all()
treeJson = []
for e in estados:
cidades = e.cidades.all()
cids = []
for c in cidades:
cids.append( {'data' : str(c.nome) , "attr" :{ "id" : str(c.nome) }})
treeJson.append({'data' : str(e.nomeEstado), 'children' : cids,
})
json = simplejson.dumps(treeJson)
return HttpResponse(json,mimetype="application/json")
E por último adicionar a url dentro do arquivo urls.py
(r'^ajax/jstreeJson', 'jstreeExample.jstree.views.jstreeJson'),
OK. Está criada a árvore a qual fica da seguinte forma:

Para mais detalhes consulte o código fonte.
Referências:
http://www.jstree.com/documentation/json_data
Código Fonte: http://github.com/petryx/petryx.blogrs.com.br
Posted on jul 04, 2009 under Python |
Desenvolvi há algum tempo um script de backup por e-mail escrito em python. Esse script lê um arquivo de configuração onde está descrito todos os arquivos que devem estar no backup, logo após gera um arquivo tar compactado com bz2, e envia para o e-mail desejado.
Utilizo esse script para arquivos pequenos – como arquivos de configurações dos servidores que administro, uma limitação desse tipo de backup é o tamanho máximo suportado para envio e recebimento de e-mails, por exemplo, o gmail não aceita arquivos maiores que 20M.
Vamos ao script:
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
#Author: Marlon Luis Petry
#Licença GPL
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
import os
import tarfile
import time
import datetime
import re
def sendMail(to, subject, text, files=[],server="localhost"):
assert type(to)==list
assert type(files)==list
fro = "Server Backup "
msg = MIMEMultipart()
msg['From'] = fro
msg['To'] = COMMASPACE.join(to)
msg['Date'] = formatdate(localtime=True)
today = datetime.date.today()
msg['Subject'] = subject + str(today)
msg.attach( MIMEText(text) )
for file in files:
part = MIMEBase('application', "octet-stream")
part.set_payload( open(file,"rb").read() )
Encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"'
% os.path.basename(file))
msg.attach(part)
smtp = smtplib.SMTP(server)
smtp.sendmail(fro, to, msg.as_string() )
smtp.close()
def backupTar(nameBackup,conf="/etc/backup.conf"):
tar = tarfile.open(nameBackup,'w:bz2')
f = open(conf,'r')
p = re.compile('\#')
for line in f:
if not p.match(line): #descarta linhas que comecem por #
file = line.replace('\n','') # Remove \n
tar.add(file) #adiciona ou arquivo tar
tar.close()
name = 'backupSRV.tar.bz2' #nome do backup
backupTar(name)
sendMail(["xxxx@gmail.com"],"backup","backup",[name])
O arquivo de configuração deve estar no /etc/backup.conf, exemplo da estrutura do arquivo:
/etc/postfix/
/etc/apache2/
/root/scripts/
O arquivo não deve possuir linhas em branco
Depois de configurado é só inserir no crontab o script para gerar o backup e enviar por email nos horários desejados.
Posted on out 18, 2008 under Python, Sem categoria |
Ontem foi a gota d’água!! Começei um download as 22:00H, já era 00:30H e nada do download terminar, faltava 40% para o download terminar, e estava louco de sono. Então me inspirei e desenvolvi um pequeno script em Python, para desligar o notebook após o download ser concluído.
Utilizei o firefox para realizar o download, o qual possui a característica de adicionar ao nome do download a extensão .part. Através desse princípio desenvolvi o script, o qual verifica a existência do arquivo *.part, existindo o arquivo o script dorme por um minuto, quando o arquivo deixar de existir o computador será desligado.
import os.path
from time import sleep
import commands
while 1:
if os.path.exists('/home/marlon/downloads/teste.rar.part'):
print 'espera 1 minuto'
sleep(60)
else:
os.system("poweroff")
Hoje pela manhã, o computador estava desligado!
A linguagem Python é muito versátil e elegante, excelente para desenvolvimento rápido. Este script pode ser modificado para tomar a decisão através do tamanho do arquivo, que com Python pode ser descoberto através do método os.path.getsize(‘file’).
Forte abraço.
Posted on ago 01, 2008 under Python |
Você já precisou renomear vários arquivos ?
Hoje tive essa necessidade pois baixei as fotos da máquina fotográfica com o programa Digikam, pois minha máquina baixa as fotos através do protocolo PTP. A biblioteca libghoto2 se encarrega de implementar o protocolo e o Digikam é um front end.
Bom mas o post é pra mostrar um script em Python para renomear a extensão de vários arquivos ao mesmo tempo. Quando baixei a fotos para o note a extensão ficou em Maiúsculo *.JPG foi necessário renomear para .jpg pois tem programas que não reconhecem a extensão .JPG como foto.
Esse script é uma adpatação do post Encontre Arquivos Recursivamente
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# author: Marlon Petry
# Date: 2008/09/01
# Function: Rename Files in Python
#
import os
import re
class findFiles:
def __init__(self):
self.result = []
def findRecursive(self,path):
if os.path.isdir(path) and not os.path.islink(path):
files = os.listdir(path)
self.result.append('d ' + path)
for file in files:
a = os.path.join(path,file)
self.findRecursive(a)
else:
self.result.append('- ' + path)
def rename(self,path,orig,new):
reg = re.compile(orig)
if os.path.isdir(path) and not os.path.islink(path):
files = os.listdir(path)
for file in files:
newExt = re.compile(orig).match
if newExt(file):
c = os.path.splitext(file)
b = c[0] + new
a = os.path.join(path,file)
b = os.path.join(path,b)
os.rename(a,b)
find = findFiles()
find.rename('/home/marlon/fotos/demoto.blogrs.com.br/','.*JPG','.jpg')
Espera que seja útil para mais alguém pois pra mim foi uma mão na roda. Renomear 400 arquivos na mão é muito enfadonho.
Abraços.
Posted on jul 07, 2008 under Python, Sem categoria |
Usar recursão para desenvolver um algoritmo deixa o código mais elegante e simples de entender. Mas perdemos a elegância e a simplicidade quando o algoritmo tem que ser debugado ou interpretado para solucionar um bug. Então neste post mostrarei dois exemplos para substituir a recursão por uma estrutura de dados conhecida como pilha ou LIFO (Last In First Out).
O primeiro exemplo é o algoritmo para cálculo do fatorial desenvolvi um classe que calcula o fatorial recursivamente def fatorialRecursive(self, x): e não recursivo def fatorialSimulateRecursive(self, x): o qual calcula o fatorial usando uma pilha, com esse método conseguimos calcular o fatorial de !1000 já com o método recursivo recebemos a seguinte exceção RuntimeError: maximum recursion depth exceeded. Eis uma vantagem de usar uma pilha ao invés de usar recursão.
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# author: Marlon Petry
# Date: 2008/07/06
# Function: Remove Recursion with one Stack in python
#
class Stack:
def __init__(self):
self.stack = []
def push(self,object):
self.stack.append(object)
def pop(self):
if len(self.stack) == 0:
raise "Error", "stack is empty"
obj = self.stack[-1]
del self.stack[-1]
return obj
def isempty(self):
if len(self.stack) == 0:
return False
else:
return True
class CalculusFatorial:
stack = Stack()
def fatorialRecursive(self, x):
if x == 0:
return 1
else:
return (x * self.fatorialRecursive(x - 1))
def fatorialSimulateRecursive(self, x):
factorial = 1;
while x > 0:
self.stack.push(x)
x -= 1
while self.stack.isempty():
factorial *= self.stack.pop()
return factorial
calc = CalculusFatorial()
print calc.fatorialRecursive(950)
print "Não recursivo"
print calc.fatorialSimulateRecursive(950)
calc.show()
O segundo algoritmo é a Torre de Hanoi, muito mais complexo para remover a recursividade fiquei uns dois dias tentando resolver até que encontrei um artigo que descreve como remover a recursão http://obelix.ee.duth.gr/~apostolo/TowersOfHanoi/index.html#non-recursive. Então segui os passos descritos no artigo e consegui chegar a solução.
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# author: Marlon Petry
# Date: 2008/07/06
# Function: Tower Hanoi Remove Recursion with one Stack in python
#
import pdb
import sys
class Stack:
def __init__(self):
self.stack = []
def push(self,object):
self.stack.append(object)
def pop(self):
if len(self.stack) == 0:
raise "Error", "stack is empty"
obj = self.stack[-1]
del self.stack[-1]
return obj
def isempty(self):
if len(self.stack) == 0:
return False
else:
return True
class Hanoi:
stack = Stack()
def hanoi(self,disk,src,dst,temp,tipo):
if(disk == 1):
print "Disk %d Move da haste %d para haste %d tipo %d" % (disk,src,dst,tipo)
else:
#pdb.set_trace()
self.hanoi(disk - 1 , src, dst, temp,1)
print "Disk %d Move da haste %d para haste %d tipo %d" % (disk,src,temp,tipo)
#pdb.set_trace()
self.hanoi(disk - 1, dst, temp, src,2)
def hanoiNotRecursive(self,disk,src,dst,temp,tipo):
flag = -1;
while disk > 0:
self.stack.push((disk, src, dst, temp,1))
disk = disk -1
flag += 1
while flag >= 0:
disk,src,dst,temp,tipo = self.stack.pop()
flag -=1;
if disk == 1:
print "Disk %d Move da haste %d para haste %d tipo %d" % (disk,src,dst,tipo)
else:
print "Disk %d Move da haste %d para haste %d tipo %d" % (disk,src,temp,tipo)
disk -= 1
while disk > 0:
self.stack.push((disk, dst, temp, src,2))
disk = disk - 1
flag += 1
testeHanoi = Hanoi()
testeHanoi.hanoi(18,1,2,3,0)
print "Hanoi not recursive"
testeHanoi.hanoiNotRecursive(3,1,2,3,1)
Não cheguei a calcular o tempo de execução para ver se existe diferença talvez faça isso em um próximo post.
Estou participando do concurso Intel Moblin com o projeto Great Picture se achar interessante o projeto seu voto será muito bem vindo mais detalhes sobre o projeto aqui.
Posted on jul 07, 2008 under Python |
Neste post mostrarei como encontrar arquivos recursivamente com um script em Python, com todos sabem a linguagem Python é muito intuitiva para programar, ou seja, uma linguagem de alto nível.
O algoritmo utiliza uma classe em Python que usará a recursividade para listar o conteúdo de um diretório através do método def findRecursive(self,path):, onde o resultado será armazenado em uma lista, que poderá ser visualizada através do método def show(self):.
Bom chega de conversa e vamo mostrar o código.
Read the rest of this entry »
Posted on jun 05, 2008 under Python |
Introdução:
ORM (Object Relacional Mapper), Mapeamento objeto relacional serve para reduzir a impedância entre banco de dados relacional e programação orientada a objetos. O modelo relacional de banco de dados é muito confiável sendo largamente utilizado nos dias de hoje, sendo baseado em tabelas, linhas e colunas, já a programação orientada a objetos tem como elemento base um objeto que é definido por seus atributos e métodos.
Para desenvolver um software orientado a objetos, salvando o estado dos objetos em um banco de dados relacionais, pode ser feito manualmente através de SQL o que é complicado. Por isso usaremos o SQLAlchemy que fará esse mapeamento objeto relacional.
Este tutorial demonstra como utilizar o SQLalchemy versão 0.4.6, que é uma ferramenta SQL escrita em Python e um ORM(Object Relacional Mapper), fornecendo uma camada de abstração para unir os dois mundos, sendo possível desenvolver software sem usar SQL, para interagir com o banco de dados.
O SQLAchemy possui dialetos para se comunicar com os seguintes banco de dados: SQLite, Postgres, MySQL, Oracle, MS-SQL, Firebird, MaxDB, MS Access, Sybase and Informix; DB2.
Read the rest of this entry »
Posted on mai 30, 2008 under Python |
This is my first post in English, sorry any is grammatical errors !!!
My intention is write a little tutorial in Python showing how to make an oriented objects chat server using sockets and threads.
A skeleton of the chat server is basically given by the following loop:
- Wait for client connection
- After the client to be connected start a thread to each new client
- Get the user name and nickname
- Entry in a loop to read the socket if exists new messages send all clients except client who generated the message
Read the rest of this entry »