Python
Você quis dizer…
0Encontrei um código muito interessante hoje, estava procurando por comparações entre python e outras linguagens, e achei esse código que faz o mesmo que o google quando digitamos algo errado no buscador. Por exemplo, ao digitar erroneamente “softwarer livre” o google retorna:
“Você quis dizer: software livre”.
Eu sempre ficava imaginando como seria complexo criar um algoritmo que pudesse realizar essa análise… Em linhas gerais o algoritmo procura por padrões em uma grande base de palavras “confiaveis” (por exemplo: livros!) e faz algumas analises para ver se a escrita está correta.
No site “http://norvig.com/spell-correct.html” tem o código original e explica como é o algoritmo.
Fiz algumas alterações no código original, e alimentei a base de palavras através de livros em formato .TXT que encontrei em: http://www.gutenberg.org/browse/scores/top-pt
Fiz um merge de cerca de 10 livros, e veja só o resultado:
python spell.py caminra
‘caminra’? Voce quis dizer? ‘caminha’
python spell.py libre
‘libre’? Voce quis dizer? ‘livre’
python spell.py caca
‘caca’? Voce quis dizer? ‘casa’
python spell.py tecrado
‘tecrado’? Voce quis dizer? ‘teclado’
import re, collections
def words(text): return re.findall('[a-z]+', text.lower())
def train(features):
model = collections.defaultdict(lambda: 1)
for f in features:
model[f] += 1
return model
NWORDS = train(words(file('big.txt').read()))
alphabet = 'abcdefghijklmnopqrstuvwxyz'
def edits1(word):
s = [(word[:i], word[i:]) for i in range(len(word) + 1)]
deletes = [a + b[1:] for a, b in s if b]
transposes = [a + b[1] + b[0] + b[2:] for a, b in s if len(b)>1]
replaces = [a + c + b[1:] for a, b in s for c in alphabet if b]
inserts = [a + c + b for a, b in s for c in alphabet]
return set(deletes + transposes + replaces + inserts)
def known_edits2(word):
return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
def known(words): return set(w for w in words if w in NWORDS)
def correct(word):
candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
return max(candidates, key=NWORDS.get)
################ Testing code from here on ################
def spelltest(wrong, verbose=True):
import time
w = correct(wrong)
if w != wrong:
print '%r? Voce quis dizer? %r' % (wrong, w)
if __name__ == '__main__':
import sys
spelltest(sys.argv[1] )
Calculando Hash de Arquivos
0Essa semana eu precisei criar uma função para calcular o hash de uma lista de arquivos para saber se todos estavam íntegros. Utilizei a função “sha1″ para fazer o calculo do hash.
# Calcula o hash do arquivo
def calcula_sha1(f, block_size=2**20):
sha1 = hashlib.sha1()
while True:
data = f.read(block_size)
if not data:
break
sha1.update(data)
return sha1.hexdigest()
if __name__ == "__main__":
import hashlib
import os
# Lista de arquivos que terao o hash calculado
arquivos=[
r'c:\caminho\arquivo1.exe',
r'c:\caminho\arquivo2.exe',
r'c:\caminho\arquivo3.exe',
]
for arq in arquivos:
print '\nArquivo: %s' % arq
if os.path.exists(arq):
f = open(arq)
hash=calcula_sha1(f)
print 'Hash (sha1): %s' % hash
else:
print 'Arquivo nao encontrado!'
Quicken e o Banco Real
0Utilizar um programa de gerenciamento financeiro para analisar os arquivos exportados através do Santander/Banco Real é um verdadeiro drama.
No site do Banco Real diz que é possível exportar o extrato bancário para o Quicken ou Microsoft Money, porém a opção do Quicken não existe!
Talvez existisse antes do Santander comprar o Banco Real…
E ainda, a Microsoft oficializou a descontinuidade do MS-Money. Ou seja, se depender do Banco Real seriamos obrigados a continuar a utilizar um programa de gerenciamento financeiro desatualizado.
A opção que eu encontrei foi de exportar o extrato bancário para .QIF (Microsoft Money 99) e utilizar o Quicken para importar esses dados….
Ai entra outro problema…. O formato de datas exportadas pelo banco real (dd/mm/yy) não é entendido pelo Quicken (que apenas aceita mm/dd/yyyy).
A solução para esse caso é rodar o script em python que desenvolvi logo abaixo.
Após exportar o extrato bancário, copie para o diretório aonde está esse script e execute-o. O resultado será a criação de um arquivo .qif com as datas formatadas para o Quicken interpretar.
import os
# Analisa apenas o diretorio atual
for path, dirs, files in os.walk('.'):
for f in files:
# Analisa apenas o arquivos .qif
if f.upper().endswith('.QIF') and not 'FORMATADO' in f:
print '... Analisando %s' % f
# Cria novo arquivo onde serao armazenados a nova formatacao
novo_arquivo=f.split('.')[0]+'-FORMATADO'+'.qif'
arq = open(novo_arquivo, 'w')
print '... Criando arquivo formatado %s' % novo_arquivo
# Abre o arquivo .qif original
lista=open(f, 'r')
linha = lista.readline()
# Analisa todas as linhas do arquivo
while linha:
linha=linha.split('\n')[0]
# Altera o formato da data
if linha.startswith('D') and linha.count('/') == 2:
data=linha.split('D')[1].split('/')
dia=data[0]
mes=data[1]
ano='20'+data[2]
nova_data='%s/%s/%s' % (mes, dia, ano)
linha='D%s' % nova_data
# Grava linhas no novo arquivo
arq.write(linha+'\n')
# Pega a proxima linha
linha = lista.readline()
# Fecha arquivo de escrita
arq.flush()
arq.close()
Apenas para ilustrar a dificuldade que tenho com o Banco Real/Santander, enviei o seguinte email para eles questionando sobre as exportações de dados:
Boa noite, na seguinte página do banco real: http://www.bancoreal.com.br/pessoas/real_ate_voce/tpl_rib.shtm
Informa que é possível exportar o extrato bancário para o programa “Quicken”, mas essa opção não está disponível no internet banking. Gostaria de saber como faço para exportar os dados de meu extrato bancário para o Quicken já que o Microsoft anunciou que deixará de desenvolver o MS-Money.
e a seguir a resposta, conforme manda o roteiro…. Enfim, não respondeu nada. O jeito vai ser usar o Python para suprir essa necessidade.
Olá Thomas,
Sobre a sua mensagem, informamos que atualmente é possível exportar o extrato da conta corrente para o Excel, Money 98, Money 99, Money 2000 ou superior.
Para mais informações, pedimos, por gentileza, que contate nossa Central de Atendimento Real Internet Banking pelos telefones abaixo.
São Paulo – (11) 3553 4445
Rio de Janeiro – (21) 3460 1303
Demais Localidades – 0800 286 4040O atendimento é 24 horas por dia, 7 dias por semana.
Ressaltamos que nosso atendimento eletrônico foi reestruturado e está sendo ampliado para todas as regiões do país gradativamente. Dessa forma poderá ter acesso à essa central pelo Disque Real, nas opções 6.4.3.3 do atendimento eletrônico.
Os telefones do Disque Real são:
Capitais e regiões metropolitanas: 4004-1199
Demais localidades: 0800 286 1199


