Найти - Пользователи
Полная версия: Алгоритм lz78
Начало » Центр помощи » Алгоритм lz78
1
ivan342
Разбираюсь с алгоритмом сжатия информации lz78. Нашёл в сети пример реализации, но не понял как мне записать сжатый результат в файл и как его потом декодировать, то, что считаю из файла. Подскажите пожалуйста.
 def compress(charstream, verbose=False):
    '''Compresses a charstream using the lz78 compression algorithm'''
    d = {}
    p = ""
    codestream = []
    i = 0
    while True:
        c = charstream[i]
        try:
            # Is character in dictionary?
            d[p + c]
            p = p + c
        except (KeyError):
            if p == "":
                o = 0
            else:
                try:
                    o = d[p]
                except (KeyError):
                    print ("This is a fatal error, no idea...")
                    exit(1)
            codestream.append((o, c))
            d[p + c] = len(d) + 1
            p = ""
        i += 1
        if i < len(charstream):
            continue
        else:
            if p != "":
                # print ("Extra Codeword: {0} {1}".format(d[p], 0))
                codestream.append((d[p], 0))
                # print (codestream)
            break
    # Possible condensing...
    output = ""
    for block in codestream:
        for part in block:
            output += str(part)
    return codestream
def decompress(codestream, verbose=False):
    '''Decompresses a codestream using the lz78 decompression algorithm'''
    d = []
    p = ""
    charstream = ""
    for (w, c) in codestream:
        if w == 0:
            p = ""
        else:
            p = d[w-1]
        d.append(p + c)
    for s in d:
        charstream += s
    return charstream
a = compress('КРАСНАЯ КРАСКА')
print(a)
b = decompress(a)
print(b)
scidam
Не вдаваясь в подрабности алгоритма, функция compress возвращает массив кортежей длины 2:
. Этот массив и нужно сохранить в файл. Это можно сделать по-разному. Например, воспользоваться pickle.dumps для формирования последовательности байт для сохранения в файл и для обратного преоразования использовать pickle.loads.
 import pickle
# compress & decompress  declarations ...
compressed = [(0, 'a'), (1, 'b'), ....]
tofile=pickle.dumps(compressed)
with open('outfile.dat', 'w') as f:
    f.write(tofile)
# reading:
with open('outfile.dat','r') as f:
    compressed_loaded = pickle.loads(f.read())
decompress(compressed_loaded)



This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB