Algoritmos de búsqueda

Un algoritmo de búsqueda sirve para localizar un elemento concreto dentro de una estructura de datos. Consiste en averiguar si el elemento en cuestión pertenece o no a dicho conjunto, además de su localización dentro de éste.

Este problema puede reducirse a devolver la existencia de un número en un vector.
Básicamente existen 2 algoritmos para resolver el problema.

Crear y leer de base de datos BERKELEY.

#!/usr/bin/env python
'''Creamos una base de datos de pruebas y la usamos para una consulta simple.'''
__shell_usage__ = ''' Este es un programa de ejemplo. Solo le debes de pasar como argumento
el nombre del fichero de la base de datos que quieres crear.'''
__version__ = 'Ejemplo de uso del modulo bsddb (Base de datos de Berkeley)'
__author__='Arturo Suelves (arturosa@lycos.es)'
import bsddb #Modulo de base de datos berkeley
import sys,os
def crear_base_datos(fichero):
    db = bsddb.btopen(fichero, 'c')
    for i in range(1000):
        db[str(i)]='Elemento_'+str(i)
    print 'Imprimimos el primer elemento de la base: ',db.first()
    print 'Imprimimos el siguiente elemento de la base: ',db.next()
    db.sync() #Importante: Para sincronizar la base en el disco,osea para grabarla
    db.close
    
def leer_de_la_base_datos(fichero):
    db = bsddb.btopen(fichero, 'r')
    elemento=raw_input('Numero del elemento a buscar: ')
    print db.set_location(elemento)
    db.close
    
if __name__ == '__main__':
    if sys.argv[1] == '--help':
        print __shell_usage__
    else:
        fichero_base_datos=sys.argv[1]
        crear_base_datos(fichero_base_datos)
        leer_de_la_base_datos(fichero_base_datos)
        print 'Programa finalizado.\n'
    sys.exit()

Enviar mensajes a una lista de direcciones

# -*- coding: utf-8 -*-
'''Programa para enviar un mensaje a una lista de direcciones de e-mail.'''

__shell_usage__ ='''Este programa envia un mensaje a una lista de direcciones de e-mail.
El fichero de direcciones debe de tener una direccion de e-mail por linea.
El fichero con el cuerpo del mensaje debe de estar en formato texto.
El puerto de SMTP es el 25.'''
__version__ ='Ejemplo de uso del modulo smtplib (protocolo SMTP)'
__author__='Arturo Suelves (arturosa@lycos.es)'

import smtplib
import sys

def enviar_mensajes_a_lista_de_correo(mail_enviador,asunto,servidorsmtp,puertosmtp):
    
    fichero_con_lista_direcciones=raw_input('Introducir path completo del fichero de direcciones: ')
    
    fichero_con_cuerpo_mensaje=raw_input('Introducir path completo del fichero con el cuerpo del mensaje: ')
    
    
    fichero_con_mensajes_enviados=raw_input('Introducir path completo para fichero log de mensajes enviados: ')
    
    fld=open(fichero_con_lista_direcciones,'r')
    fme=open(fichero_con_mensajes_enviados,'w')
    
    for i in fld.readlines():
        try:
            mensaje = "From: "+mail_enviador+"\nSubject: "+asunto+"\nTo: "+i+"\n"
            fcm=open(fichero_con_cuerpo_mensaje,'r')
            print '\nMensaje para: '+i
    
            for ii in fcm.readlines():
                mensaje=mensaje+ii
                fcm.close()
    
    
            print 'Abierto fichero del cuerpo del mensaje...\n'
            server = smtplib.SMTP(servidorsmtp,int(puertosmtp))
            print '\nImprimiendo la informacion de debug de la conexion con el servidor SMTP.\n'
    
            server.set_debuglevel(1)
    #Esta linea sirve para imprimir informacion de debuger sobre el proceso de enviar los mensajes
            server.sendmail(mail_enviador, i, mensaje)
    
            fme.write('Mensaje enviado a:'+i)
            print 'Mensaje enviado a: '+i
            server.quit()
    
        except:
    
            print 'Error enviando el fichero a: '+ i
            fme.write('Error enviado el fichero a: '+i)
            fld.close()
            fme.close()


if __name__ == '__main__' :

    print '''Uso:
Este programa envia un mensaje a una lista de direcciones de e-mail.
El fichero de direcciones debe de tener una direccion de e-mail por linea.
El fichero con el cuerpo del mensaje debe de estar en formato texto.
El puerto de SMTP estandard es el 25.
'''
    enviador_mensaje=raw_input('Introducir e-mail del enviador: ')
    asunto_mensaje=raw_input('Introducir asunto del mensaje: ')
    servidorsmtp_mensaje=raw_input('Introducir servidor de SMTP: ')
    puertosmtp_mensaje=raw_input('Introducir puerto del SMTP : ')

    enviar_mensajes_a_lista_de_correo(enviador_mensaje,asunto_mensaje,servidorsmtp_mensaje,puertosmtp_mensaje)

    print 'Programa finalizado.\n'
    sys.exit()





Expresiones regulares.Convertir de MAYUSCULAS a minusculas

#!/usr/bin/env python
'''Ejemplo del uso de expresiones regulares en Python.'''
__shell_usage__ = ''' Este es un programa de ejemplo. Busca en fichero HTML dado
como argumento, todas las marcas de html y las pone en minusculas y saca el 
resultado por pantalla.'''
__version__ = 'Ejemplo de uso de expresiones regulares'
__author__='Arturo Suelves (arturosa@lycos.es)'
import os,sys
import string,re
def Mm(fentrada):
    flectura=open(fentrada,'r')
    f=flectura.read()
    flectura.close()
    coincidencias1=re.findall("[\n][^<]*[>]",f)
    #Busca todas las marcas html desde el principio de la linea nueva al final
    coincidencias2=re.findall("[<][^>]*[\n]",f)+
    #Busca todas las marcas html desde el principio de la linea al final de la linea
    coincidencias3=re.findall("[<].*[>]",f)
    #Busca todas las marcas html que van en una linea
    resultado=f
    for i in coincidencias1:
        busca=re.search(i,resultado)
        if busca:
            p1=busca.start()
            p2=busca.end()
            resultado1=resultado[:p1]
            resultado2=resultado[p2:]
            anadido=string.lower(f[p1:p2])
            resultado=resultado1+anadido+resultado2
    for i in coincidencias2:
        busca=re.search(i,resultado)
        if busca:
            p1=busca.start()
            p2=busca.end()
            resultado1=resultado[:p1]
            resultado2=resultado[p2:]
            anadido=string.lower(f[p1:p2])
            resultado=resultado1+anadido+resultado2
    for i in coincidencias3:
        busca=re.search(i,resultado)
        if busca:
            p1=busca.start()
            p2=busca.end()
            resultado1=resultado[:p1]
            resultado2=resultado[p2:]
            anadido=string.lower(f[p1:p2])
            resultado=resultado1+anadido+resultado2 
    return resultado
if __name__ == '__main__':
    if len(sys.argv) == 2:
        if sys.argv[1] <> '':
            print Mm(sys.argv[1])


Crear y leer ficheros ZIP

'''Programa de pruebas para el manejo del modulo zipfile.'''
__shell_usage__ = '''\nAyuda:
Este programa crea un fichero zip con todos los ficheros de un directorio.
Dicho fichero zip se guarda en el mismo directorio.
Uso: pruebaszip [-c] [-l] [--help]
        -c:     crea un zip
        -l:     lista los ficheros de un fichero zip y muestra informacion
        --help: muestra esta pantalla de ayuda
'''
__author__ = 'Arturo Suelves Albert: arturosa@lycos.es'
__version__ = 'Pruebas de ZIP - 20/04/2001'
import zipfile
import os.path
import os,sys
def hacer_zip(ficherozip,directorio_ficheros_a_zipear):
    lista_de_ficheros_a_zipear=os.listdir(directorio_ficheros_a_zipear)
    a=zipfile.ZipFile(ficherozip,'w',8)
    for i in lista_de_ficheros_a_zipear:
        if os.path.isfile(str(directorio_ficheros_a_zipear)+'\\'+str(i)):
            a.write(str(directorio_ficheros_a_zipear)+'\\'+str(i))
            print'.',
    a.close()
def leer_zip(ficherozip):
    a=zipfile.ZipFile(ficherozip,'r')
    #print 'Lista de ficheros incluidos en el zip: ',a.namelist(),'\n'
    #fichero_a_ver=raw_input('Fichero a visualizar: ')
    print a.read(fichero_a_ver)
    for contador in a.namelist():
        print a.read(contador) #esta linea imprime el contenido del fichero
        print '\nNombre del fichero: '+contador
        print 'Ultima modificacion del fichero: '+str(a.getinfo(contador).date_time)
        print 'Sistema que creo el fichero: '+str(a.getinfo(contador).create_system)
        print 'Tamaño comprimido: '+str(a.getinfo(contador).compress_size)
        print 'Tamaño descomprimido: '+str(a.getinfo(contador).file_size)
        print 'Tipo de compresion: '+str(a.getinfo(contador).compress_type)+'\n'
        tecla=raw_input('Pulse ENTER para ver el siguiente documento en el fichero zip.')
    a.close()
 
    
if __name__ == '__main__':
    if len(sys.argv) == 2:
        if sys.argv[1] == '-c':
            directorio_trabajo=raw_input('\nDirectorio con los ficheros a zipear:')
            os.chdir(directorio_trabajo)
            nombre_zip=raw_input('\nNombre del fichero ZIP: ')
            if os.path.isfile(nombre_zip):
                print '\nYa existe un fichero en el directorio con este nombre: '+nombre_zip
                sys.exit()
            else:
                hacer_zip(nombre_zip,directorio_trabajo)
        else:
            if sys.argv[1] == '-l':
                nombre_zip=raw_input('\nPath completo del fichero ZIP: ')
                leer_zip(nombre_zip)
            else:
                    print '\nNombre del programa:',sys.argv[0]
                    print __shell_usage__
                    print __author__
    else:
        print '\nNombre del programa:',sys.argv[0]
        print __shell_usage__
        print __author__
    sys.exit()

Cálculo de números primos. Criva de Erastótenes.

# -*- coding: utf-8 -*-
"""
Criva de Erastótenes.

Calcula los numeros primos entre 0 y uno dado n.
Ver explicación en:
http://es.wikipedia.org/wiki/Criba_de_Erat%C3%B3stenes

author : arturo.suelves@gmail.com
fecha : 15-4-2008
version de python: 2.7
"""
import math

n=int(raw_input('Número máximo:'))

lista_numeros=[]

for i in range(0,n):
    lista_numeros.append(i)

print "Lista de numeros original:"
print lista_numeros

seguir=raw_input('Calcular los números primos:')

for i in range(2, int(math.sqrt(n))):
    if lista_numeros[i] <> 'X':
        for j in range(i,n/i):
            lista_numeros[j*i]='X'
print "Lista de números primos entre 0 y "+str(n)+"."            
print lista_numeros