Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 5, 2016 03:21:25

ivan342
Зарегистрирован: 2016-02-28
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Алгоритм lz78

Разбираюсь с алгоритмом сжатия информации 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)

Отредактировано ivan342 (Ноя. 5, 2016 03:22:49)

Офлайн

#2 Ноя. 5, 2016 12:09:22

scidam
Зарегистрирован: 2016-06-15
Сообщения: 288
Репутация: +  35  -
Профиль   Отправить e-mail  

Алгоритм lz78

Не вдаваясь в подрабности алгоритма, функция 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)



Отредактировано scidam (Ноя. 5, 2016 12:10:08)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version