LZ77 Kompressionskratzer
Ich erstelle eine LZ77-Komprimierung. Ich habe die gesamte Datei als einzelne Zeichenfolge gelesen und versucht, sie zu komprimieren. Gibt es eine andere Möglichkeit? Ich werde meinen Code unten anhängen und feststellen, ob Änderungen vorgenommen werden müssen, damit das Programm sehr schnell komprimiert, auch wenn es eine große Datei liest.
Dateieingabe importieren
Klasse zuweisen:
def pattern(self, data):
self.skip = []
self.m = len(data)
for k in range(256): self.skip.append(self.m)
for k in range(self.m - 1): self.skip[ord(data[k])] = self.m - k - 1
self.skip = tuple(self.skip)
self.data = data
def find(self, text):
n = len(text)
if self.m > n: return -1
k = self.m - 1
while k < n:
j = self.m - 1; i = k
while j >= 0 and text[i] == self.data[j]:
j -= 1; i -= 1
if j == -1: return i + 1
k += self.skip[ord(text[k])]
return -1
Klasse LZ77:
def __init__(self, data):
self.position = 0
self.window = ""
self.stream = data
self.streamSize = len(self.stream)
self.search = Assign()
def Encode(self):
p = 0
c = ''
lastresult = 0
found = 0
for i in range(self.streamSize):
self.search.pattern(self.stream[self.position:self.position+i+1])
result = self.search.find(self.window)
if result < 0: break
lastresult = result
found = 1
c = self.stream[self.position+i]
p = lastresult
B = 0
if i > 0: B = self.position - p
L = i
if self.streamSize > 0:
self.position += i + 1
self.streamSize -= i + 1
self.window = self.stream[:self.position]
#print B,L,c
return ((B, L), c)
def Encoder(self):
output = ""
length = self.streamSize
while self.streamSize > 0:
((B, L), C) = self.Encode()
output += str(B) + str(L) + C
return (output)
def aiyoo (Dateiname):
enter = raw_input("enter the filename to which the original file is to e compressed to")
enter1 = enter
fob1 = open(enter,'wb')
print filename
fob = open(filename,'rb')
original = ''
for i in fob:
original += i
lz = LZ77(original)
stream = lz.Encoder()
fob1.write(stream)
fob.close()
fob1.close()
Danke im Voraus