Форум сайта python.su
Разбираюсь с алгоритмом сжатия информации 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)
Офлайн
Не вдаваясь в подрабности алгоритма, функция 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)
Офлайн