Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - luu_cuuesta

#1
Scripting / Utilización de bitarrays
29 Diciembre 2021, 16:10 PM
Hola a todos!!
Querría saber cómo se podría implementar el código que muestro a continuación pero utilizando bitarrays.

Código (python) [Seleccionar]

# Importamos las librerías necesarias
from tqdm import tqdm
import os
import sys

# Variables globales que apuntan a los ficheros
global archivo


# Función que muestra por pantalla las opciones que tendrá que elegir el usuario
# Por tanto, no tiene parámetros de entrada
# Pero sí de salida. Devuelve la opción que haya introducido el usuario
def menu():
   print("\nCodificación de texto con LZSS")
   print("------------------------------\n")
   
   print("\t\t MENU")
   print("1. Comprimir archivo")
   print("2. Descomprimir archivo")
   print("0. Salir")
   opcion=input("Introduzca el número de la opción a elegir: ")
   return opcion


# Función que tiene como objetivo leer un fichero
# Como parámetro de entrada se le pasa la ruta del fichero que ha introducido el usuario
# Y como parámetro de salida tiene una lista que devuelve el contenido del fichero leido
def Leer_Fichero(ruta):
   archivo = open(ruta,'r',encoding="utf-8",errors='ignore') #ponemos el utf-8 porque nuestro archivo contiene caracteres especiales
   datos = []
   for linea in archivo:
       datos.append(linea)
   archivo.close()
   return datos

# Funcion para escribir texto comprimido en archivo
def Escribe_Fichero(dest,Texto,lInsp,lMem):
   archivo = open(dest,"w")
   archivo.write(str(lInsp) + '\n')
   archivo.write(str(lMem) + '\n')
   archivo.write(Texto)
   archivo.close()
   
def Escribe_Fichero2(Ruta,Texto):
   archivo = open(Ruta,"w")
   archivo.write(Texto)
   archivo.close()
   

# Funcion para codificar
def _encode(prim,cnt):
   aux = '(' + str(hex(prim))[2:] + ',' + str(hex(cnt))[2:] + ')'
   return aux

#Funcion que devuelve inicio y fin en enteros
def _decode(Coded):
   poscoma = str.find(Coded,',')
   if poscoma != -1:
       try:
           ini = int(Coded[1 : poscoma],16)
       except:
           return 0,0
       try:
           fin = int(Coded[poscoma + 1: len(Coded)-1],16)
       except:
           return 0,0
       return ini,fin
   else:
       return 0,0

# Cadena con espacios
def _blancos(Cad,Cantidad):
   Cad = Cad + " " * Cantidad
   return Cad

# Inserta blancos al frente
def _fblancos(Cad,Cantidad):
   Cad = " " * Cantidad + Cad
   return Cad

# Mueve caracteres a la ventana de inspeccion
def _toshift(Vdel,Vins,cantidad):
   Vins = Vins[cantidad:] + Vdel[:cantidad]
   Vdel = Vdel[cantidad:]
   return Vdel,Vins

# Funcion para buscar coincidencias
def _matches(mem,insp):
   while insp != '':
       pos = str.find(mem,insp)
       if pos != -1:
           break
       else:
           insp = insp[:-1]
   return pos,len(insp)

# Funcion que devuelve un texto comprimido
def Comprimir(Texto,TamInsp,TamMem):
   V_Mem = ''
   V_Insp = ''
   V_Mem = _blancos(V_Mem,TamMem)
   V_Insp = _blancos(V_Insp,TamInsp)
   Comprimido = [] #Array donde junto el texto a guardar
   for L in tqdm(Texto):
       cant = len(L)
       cont = 1
       shcant = cont
       L_Comp = "" #Linea a comprimir
       L, V_Insp = _toshift(L,V_Insp,TamInsp)#Inicializo mi ventana insp  
       L = _blancos(L,TamInsp)
       while cont < cant:
           inicio,fin = _matches(V_Mem,V_Insp)
       #Unicamente se codificaran las coincidencias
       #mayores a la codificacion
           if (fin - inicio) < len(str(TamMem)*2)+3:
               L_Comp = L_Comp[:] + V_Insp[0]
               #Muevo un solo caracter del texto a inspeccion
               shcant = 1
               cont += shcant
           else:
               L_Comp = L_Comp[:] + _encode(inicio,fin)
               shcant = fin
               cont += shcant
           V_Insp, V_Mem = _toshift(V_Insp,V_Mem,shcant)
           V_Insp = _fblancos(V_Insp,shcant)
           L, V_Insp = _toshift(L,V_Insp,shcant)
           L = _blancos(L,TamInsp)
       Comprimido.append(L_Comp)
   return '\n'.join(Comprimido)  


def Descomprime(Texto):
   szInsp = int(Texto[0])
   szMem = int(Texto[1])
   Texto = Texto[2:]
   l_Descomp = []
   V_Mem =''
   V_Mem = _blancos(V_Mem,szMem)  
   for l in tqdm(Texto):
       s_Descomp = ''
       while l != '\n' and l!= '':
           if l[0] != '(':
               V_Mem = V_Mem[1:] + l[0]
               s_Descomp = s_Descomp + l[0]
               l = l[1:]
           else:
               PosFin = str.find(l,')')
               Encoded = l[0:PosFin+1]
               i,f = _decode(Encoded)
               if (i != 0 or f !=0):
                   s_Descomp = s_Descomp + V_Mem[i:i+f]
                   V_Mem = V_Mem[f:] + V_Mem[i:i+f]
                   l = l[PosFin+1:]
               else:
                   V_Mem = V_Mem[1:] + l[0]
                   s_Descomp = s_Descomp + l[0]
                   l = l[1:]
       l_Descomp.append(s_Descomp)
   return '\n'.join(l_Descomp)                

   
#funcion principal que llama al resto de funciones
def main():
   
   opcion = menu()
   
   while(opcion=='1'):
       flag = False
       
       while(flag==False):
           ruta=input("¿Qué texto desea comprimir? Introduzca la ruta completa:\n")
       
           if (os.path.exists(ruta) == False):
               print("\n*Archivo no encontrado*")
               print("Introduce un archivo existente.")
           else:
               flag = True
       
       TamInsp = int(input('Tamaño ventana inspección: '))
       TamMem = int(input('Tamaño ventana memoria: '))
       Documento = Leer_Fichero(ruta)
       
       if Documento != None:  
           Txt_Comp = Comprimir(Documento,TamInsp,TamMem)
           print("\n¡El archivo se ha comprimido satisfactoriamente!")
           
           dest = input('¿Dónde desea guardar dicha compresión? Introduzca la ruta destino:\n')
           
           Escribe_Fichero(dest,Txt_Comp,TamInsp,TamMem)
           print("\nEl archivo se ha guardado.\n")
       else:
           print ('NO EXISTE EL ARCHIVO/ARCHIVO VACIO')
           
       continuar = input('Pulse "INTRO" para finalizar.')
       sys.exit()
       
       
   while(opcion=='2'):
       flag = False
       
       while(flag==False):
           ruta=input("¿Que fichero desea descomprimir? Introduzca la ruta completa:\n")
           
           if (os.path.exists(ruta) == False):
               print("*Archivo no encontrado*")
               print("Introduce un archivo existente.")
           else:
               flag = True
       
       Documento=Leer_Fichero(ruta)
       toArchivo=Descomprime(Documento)
       print("\n¡El archivo se ha descomprimido satisfactoriamente!")
       dest = input('¿Dónde desea guardar la descompresión? Introduzca la ruta destino:\n')
       Escribe_Fichero2(dest,toArchivo)
       print("\nEl archivo se ha guardado.\n")
       
       continuar = input('Pulse "INTRO" para finalizar.')
       sys.exit()


main()