Вы находитесь на странице: 1из 1

Группа: ІПЗ-17-1

Выполнил: Волочай Владислав


Лабораторная работа №9.1
Создайте программу, которая оценивает степень сжатия по Шеннону для
произвольного заданного файла.
import sys
import os
def shannon_fano_encoder(iA, iB): # iA to iB : index interval
global tupleList
size = iB - iA + 1
if size > 1:
mid = int(size / 2 + iA)
for i in range(iA, iB + 1):
tup = tupleList[i]
if i < mid: # top group
tupleList[i] = (tup[0], tup[1], tup[2] + '0')
else:
tupleList[i] = (tup[0], tup[1], tup[2] + '1')
shannon_fano_encoder(iA, mid - 1)
shannon_fano_encoder(mid, iB)
with open('sample.txt', 'r') as myfile:
txt=myfile.read().replace('\n', '')
print(txt)
inputFile = 'sample.txt'
fileSize = os.path.getsize(inputFile)
fi = open(inputFile, 'rb')
byteArr = bytearray(fi.read(fileSize))
fi.close()
fileSize = len(byteArr)
freqList = [0] * 256
for b in byteArr:
freqList[b] += 1
tupleList = []
for b in range(256):
if freqList[b] > 0:
tupleList.append((freqList[b], b, ''))
tupleList = sorted(tupleList, key=lambda tup: tup[0], reverse = True)
shannon_fano_encoder(0, len(tupleList) - 1)
dic = dict([(tup[1], tup[2]) for tup in tupleList])
del tupleList # unneeded anymore
a=0
for i in dic.items():
print(chr(i[0]),i[1])
a=a+len(i[1])
print("Без сжатия: ",(os.path.getsize('sample.txt')*8),"bits")
print("Сжатие по шенону: ",a,"bits")
print("Сжали на: ",100-int((a*100)/(os.path.getsize('sample.txt')*8)),"%")