A continuación se presenta una práctica más real de implementar el uso de proyectos
con pickle para operaciones CRUD en un archivo de registros serializados:
"""Modulo de Main"""importosfrompathlibimportPathimportpickleclassProducto:"""Clase Producto"""def__init__(self,id,descripcion):"""Método constructor de clase de Producto Args: id (int): ID del producto descripcion (str): Descripción del producto """self.id=idself.descripcion=descripciondef__str__(self):"""Método de representación de informal del objeto, usado para crear la salida que se le mostrará al usuario"""return"Id: {0}\nDescripción: {1}".format(self.id,self.descripcion)def__repr__(self):"""Método de representación de formal del objeto, usado para depuración y desarrollo"""returnf'{self.__class__.__name__}:({repr(self.id)}, {repr(self.descripcion)})'classInventario:"""Clase Inventario"""def__init__(self):"""Método constructor de clase de Inventario"""self._DB_DIR=os.path.dirname(os.path.abspath(__file__))+os.sep+'filestorage/'self.productos=[]self.archivo=self._DB_DIR+"inventario.pkl"self.leer_datos()def__str__(self):"""Método de representación de informal del objeto, usado para crear la salida que se le mostrará al usuario"""return"Ruta BD: {0}".format(self.archivo)def__repr__(self):"""Método de representación de formal del objeto, usado para depuración y desarrollo"""returnf'{self.__class__.__name__}:({repr(self.archivo)})'defleer_datos(self):"""Leer el archivo de almacenamiento"""try:Path(self._DB_DIR).mkdir(parents=True,exist_ok=True)withopen(self.archivo,'rb')asbd:self.productos=pickle.load(bd)exceptIOError:print("El archivo no existe en la ubicación")defguardar_datos(self):"""Guarda los datos"""try:ifos.path.isfile(self.archivo):os.remove(self.archivo)withopen(self.archivo,'wb')asbd:pickle.dump(self.productos,bd)exceptIOError:print("El archivo no existe en la ubicación")defexiste(self,codigo):"""Valida si existe el producto Args: codigo (int): ID del producto """ifself.productos:forproductoinself.productos:ifproducto.id==codigo:returnTruereturnFalsedefbuscar(self,codigo):"""Buscar el producto en el Inventario Args: codigo (int): ID del producto """forposicion,productoinenumerate(self.productos):ifproducto.id==codigo:returnposicion,productoreturn0,Nonedefagregar_registro(self,codigo):"""Agregar el producto Args: codigo (int): ID del producto """descripcion=input("Descripción: ")producto=Producto(codigo,descripcion)self.productos.append(producto)self.guardar_datos()defmostrar_registro(self,codigo):"""Mostrar el producto Args: codigo (int): ID del producto """ifself.existe(codigo):posicion,producto=self.buscar(codigo)print(producto)else:print("¡El producto no existe!")input("Presione ENTER para continuar")defactualizar_registro(self,codigo):"""Actualizar el producto Args: codigo (int): ID del producto """ifself.existe(codigo):posicion,producto=self.buscar(codigo)print(producto)print("Escribe nuevos datos: ")descripcion=input("Descripción: ")self.productos[posicion].descripcion=descripcionself.guardar_datos()print("¡Actualizado exitosamente!")else:print("¡El producto no existe!")input("Presione ENTER para continuar")defeliminar_registro(self,codigo):"""Eliminar el producto Args: codigo (int): ID del producto """ifself.existe(codigo):posicion,producto=self.buscar(codigo)print(producto)confirmar=input("Estas seguro? (S/N): ").upper()ifconfirmarin("s","S","si","Si","SI"):delself.productos[posicion]self.guardar_datos()print("¡Eliminado exitosamente!")else:print("¡El producto no existe!")input("Presione ENTER para continuar")defmenu_principal(self):"""Menu principal del programa"""try:whileTrue:print("\n==============")print("MENÚ PRINCIPAL")print("==============\n")opciones_menu="1) Crear\n"opciones_menu+="2) Consultar\n"opciones_menu+="3) Actualizar\n"opciones_menu+="4) Eliminar\n"opciones_menu+="5) Salir\n"opciones_menu+="\nElija uno: "opcion=int(input(opciones_menu))inventario=Inventario()ifopcion==1:codigo=int(input("Id de Producto: "))ifnotinventario.existe(codigo):inventario.agregar_registro(codigo)print("¡Registro exitoso!")else:print("¡Producto ya existe!")input("Presione ENTER para continuar")elifopcion==2:codigo=int(input("Id de Producto: "))inventario.mostrar_registro(codigo)elifopcion==3:codigo=int(input("Id de Producto: "))inventario.actualizar_registro(codigo)elifopcion==4:codigo=int(input("Id de Producto: "))inventario.eliminar_registro(codigo)elifopcion==5:breakexceptKeyboardInterrupt:importsysprint()sys.exit()if__name__=='__main__':app=Inventario()app.menu_principal()
Importante
Usted puede descargar el código usado en esta sección haciendo clic en el
siguiente enlace: main.py.
Truco
Para ejecutar el código main.py, abra una consola de comando,
acceda al directorio donde se encuentra ambos programas:
leccion2/
└── pickle/
└── crud/
└── main.py
Si tiene la estructura de archivo previa, entonces ejecute el siguiente comando:
$ python main.py
Asi de esta forma puede ingresar, consultar, actualizar y eliminar
registro en un archivo serializado de objetos python pickle.