Bienvenidos sean a este post, hoy hablaremos de otra variante para almacenar informacion como es shelve.
En este caso cuando hablamos de shelf nos referimos a un objeto persistente de tipo diccionario, la verdadera ventaja de trabajar con este es que cualquier objeto de tipo shelf puede ser usado con pickle, asi que no estamos restringido como si fuera una base de datos, aunque es util e interesante este modulo rara vez es usado pero por un tema de conocimiento vamos a aplicar un ejemplo para entender como funciona, comencemos importando el modulo:
>>> import shelve
Con nuestro modulo importado vamos a crear una nueva clase:
>>> class Persona:
... def __init__(self, nombre, id):
... self.nombre = nombre
... self.id = id
...
>>>
Aqui crearemos una persona pero solamente definimos un __init__ para que nos defina una variable para el nombre y el id con los valores recibidos, no la haremos tan complicada porque lo dificil sera a continuacion, agreguemos el siguiente bloque:
>>> with shelve.open('shelf1.shelve') as bd:
... bd['darkie'] = Persona('DarkZero', 100123)
... bd['gary'] = Persona('Enzo', 100456)
... bd['una_lista'] = [10, 11, 12]
... bd['borrame'] = 'Este se debe borrar...'
... print(list(bd.keys()))
... del bd['borrame']
... print(list(bd.keys()))
... print('borrame' in bd)
... print('gary' in bd)
... una_lista = bd['una_lista']
... una_lista.append(30)
... bd['una_lista'] = una_lista
... print(bd['una_lista'])
...
Por medio de with y open creamos un archivo llamado shelf1.shelve y lo asignaremos al objeto bd, lo siguiente sera este bloque:
... bd['darkie'] = Persona('DarkZero', 100123)
... bd['gary'] = Persona('Enzo', 100456)
... bd['una_lista'] = [10, 11, 12]
... bd['borrame'] = 'Este se debe borrar...'
Aqui crearemos cuatro entradas en nuestro archivo cada uno con una clave que lo represente, tal como un diccionario, para los primeros dos datos usamos a la clase persona donde almacenaremos el nombre y el id de cada uno de ellos, luego generamos una lista y por ultimo un dato que borraremos, lo siguiente sera esto:
print(list(bd.keys()))
Aqui veremos las claves (no los valores) que existen en el objeto bd, la siguiente linea se encarga de borrar el contenido relacionado a la clave ‘borrame’ y volvemos a mostrar las claves que quedaron, despues tenemos estas dos lineas:
... print('borrame' in bd)
... print('gary' in bd)
En ambos casos le pedimos que nos notifique si ambas claves o valores existen en bd, nos mostrara el valor dependiendo de la condicion si son verdaderas o falsas pero ya lo veremos luego pasemos al siguiente bloque:
... una_lista = bd['una_lista']
... una_lista.append(30)
... bd['una_lista'] = una_lista
... print(bd['una_lista'])
Aqui crearemos un nuevo objeto donde le pasaremos todos los valores almacenados en la clave ‘una_lista’ de bd, luego por medio de append le agregaremos un nuevo valor y despues de modificado reemplazaremos el valor actual de la clave ‘una_lista’ con los nuevos valores de una_lista, por ultimo los mostramos en pantalla, veamos como es la salida:
['borrame', 'darkie', 'una_lista', 'gary']
['darkie', 'una_lista', 'gary']
False
True
[10, 11, 12, 30]
La primera nos muestra todas las claves que existen, la siguiente las que quedaron despues de borrar a ‘borrame’, la siguiente es cuando le preguntamos si ‘borrame’ existe en bd, nos devuelve False, y la siguiente es cuando preguntamos si ‘gary’ existe en bd y nos devuelve True, la utima linea nos muestra el nuevo valor asociado a ‘una_lista’ despues de todo el proceso que realizamos para modificarlo, como podemos ver funciono perfectamente pero el ultimo bloque podemos hacerlo de una manera mas elegante, para ello crearemos otro ejemplo con el siguiente codigo:
>>> with shelve.open('shelf2.shelve', writeback=True) as bd:
... bd['una_lista'] = [21, 22, 23]
... bd['una_lista'].append(24)
... print(bd['una_lista'])
...
[21, 22, 23, 24]
>>>
La primera modificacion que vemos es que al momento de usar open le pasamos junto al nombre del archivo la opcion writeback con el valor de True, esto nos permite poder modificar los valores que contienen las claves como si fueran parte del objeto, por esta razon despues de creada la lista usando append agregamos directamente el valor y al mostrarlo vemos que sucedio como si nada pero si nos ahorra tanto trabajo porque no esta implementada por defecto? La respuesta es sencilla, trae problemas de mayor consumo de memoria, ralentiza un poco mas el proceso y tambien lo hace al momento de cerrar el shelf, por esta razon no se habilita de manera predeterminada pero en caso de que ninguna de los temas anteriores sea un inconveniente puede implementarse, por ultimo si se estan preguntando por como trabaja este modulo, si nos genera un archivo con el nombre pasado pero con una curiosidad veamos el nombre que posee y su contenido:
tinchicus@dbn001vrt:~/lenguajes/python$ cat shelf1.shelve.db
����zk�]q(K
K
K
e.una_lista�c__main__
P�]q(K
K
K
Ke.una_lista�c__main__
Persona
���(эh^�c__main__rkZeroqXidqJub.darkie�
Persona
q)�q}q(XnombreqXEnzoqXidqJh�ub.garytinchicus@dbn001vrt:~/lenguajes/python$
Tambien lo crea con el formato de bytes pero observen que al nombre informado le agrego la extension .db simbolizando que trabaja como una base de datos, esta en conjunto con la vista en el post anterior son las mas utilizadas para el tema de los datos persistentes pero en el proximo post veremos a la estrella de este tema.
En resumen, hoy hemos visto como trabajar con shelve, como es la forma de trabajar, las ventajas que nos provee con respecto al metodo visto en el post anterior y algunas ventajas con respecto a las bases de datos, hemos visto un ejemplo de como trabajar con este modulo, como nos provee las herramientas para trabajar y como es el archivo que genera para trabajar, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
