Python

Você quis dizer…

0

Encontrei 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

0

Essa 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

0

Utilizar 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 4040

O 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

Go to Top