Querría saber cómo se podría implementar el código que muestro a continuación pero utilizando bitarrays.
Código
# 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()