Есть произвольный файл, каждый прочитанный из него байт нужно использовать как индекс массива.
за первые пол-часа изучения Питона пошел извращенским путем: считая, что символы строкового объекта, прочитанного из файла соответствуют ASC II представлению, вызываю ord(), который и дает мне ASC II код строки, длиной в один символ. Скорость работы, как я понимаю, паршивая.
import math
def cEntropy(p):
ent = 0
for i in range(CH_MAX):
if p[i] != 0:
ent = ent + p[i] * math.log(p[i]) / math.log(2)
ent = -ent
return ent
CH_MAX = 256
codes = [0]*256
p = [0]*256
fileLength = 0
m = 0
fName = raw_input('Enter filename: ')
f = open(fName, 'rb')
while 1:
nel = (f.read(1)) #Читаем очередной байт
if nel == "":
break
t = ord(nel) #Вот тут само извращение
codes[t] = codes[t] + 1
fileLength = fileLength + 1
if fileLenth % 1000000 == 0:
print '*'
for i in range(CH_MAX):
p[i] = float(codes[i]) / fileLength
if codes[i] != 0:
m = m + 1
entropy = cEntropy(p)
print 'File size is:', fileLength, 'bytes'
print 'This file entropy is:' , entropy, 'bits/mes'
print 'Dimension of primary alphabet:', m
f.close()