Ошибка при сжимании данных из файла с помощью метода Шеннона
на вход программы поступает ,например,картинка или любой другой файл,после чего он кодируется при помощи base 64 (или чтоб не кодировать base 64 подскажите,как переводить файлы в двоичный формат),дальше сжимается при помощи алгоритма Шеннона и выскакивает такая ошибка: if key in a: TypeError: argument of type 'int' is not iterable Как можно решить данную ошибку?
import collections
from base64 import b64encode as enc64
from base64 import b64decode as dec64
file = input("Enter the filename:")
with open(file, 'rb') as f:
message =enc64(f.read())
c = {}
def create_list(message):
list = dict(collections.Counter(message)) #предназначен для удобных и быстрых подсчетов количества появлений неизменяемых элементов в последовательностях
for key, value in list.items():
print(key, ' : ', value) #создание отсортированного списка по вероятности
list_sorted = sorted(iter(list.items()), key = lambda k_v:(k_v[1],k_v[0]),reverse=True)
final_list = []
for key,value in list_sorted:
final_list.append([key,value,''])
return final_list
print("Shannon tree with merged pathways:")
def divide_list(list):
if len(list) == 2:
print([list[0]],[list[1]])#печать объединенных путей
return [list[0]],[list[1]]
else:
n = 0
for i in list:
n+= i[1]
x = 0
distance = abs(2*x - n)
j = 0
for i in range(len(list)): #shannon древовидная структура
x += list[i][1]
if distance < abs(2*x - n):
j = i
print(list[0:j+1], list[j+1:]) #печать объединенных путей
return list[0:j+1], list[j+1:]
def label_list(list):
list1,list2 = divide_list(list)
for i in list1:
i[2] += '0'
c[i[0]] = i[2]
for i in list2:
i[2] += '1'
c[i[0]] = i[2]
if len(list1)==1 and len(list2)==1: #присвоение значений дереву
return
label_list(list2)
return c
code = label_list(create_list(message))
print("Shannon's Encoded Code:")
output = open("compressed.txt","w+") # генерирует выходной двоичный файл
letter_binary = []
for key, value in code.items():
print(key, ' : ', value)
letter_binary.append([key,value])
print("Compressed file generated as compressed.txt")
for a in message:
for key, value in code.items():
if key in a:
print(key, ' : ', value)
output.write(value)
output = open("compressed.txt","r")
intermediate = output.readlines()
bitstring = ""
for digit in intermediate:
bitstring = bitstring + digit
uncompressed_string =""
code =""
for digit in bitstring:
code = code+digit
pos=0
for letter in letter_binary: # декодирование двоичного файла и генерация исходных данных
if code ==letter[1]:
uncompressed_string=uncompressed_string+letter_binary[pos] [0]
code=""
pos+=1
print("Your UNCOMPRESSED data is:")
print(uncompressed_string)
Ответы (1 шт):
Причем тут сжатие данных? Причем тут алгоритм Шеннона? Причем тут непонятная простыня кода на сотню строчек? Вам же ясно написали " if key in a: TypeError: argument of type 'int' is not iterable " При этом компилятор вам даже сказал в какой строчке это происходит, но вы не удосужились это сообщить нам. Ну так найдите эту строчку, посмотрите, где там с объектом типа int вы пытаетесь работать как с иттератором, потом посмотрите, где и как вы эту переменную определяете - и исправляйте.
Подсказка. Только потому, что вы новичек на форуме. Ошибка у вас вот в этой строке,
if key in a:
где "a" - имеет тип int. А для этого типа оператор in не определен. Измените строчку на
if key == a:
Впрочем, это не спасет вас от следующих ошибок в вашем коде. Поэтому лучше сначала изучите Python, лучше - по какой нибудь серьезной книге, а потом пробуйте запускать какие-то чужие программы. И тогда во-первых, такие простые ошибки не будут вас повергать в шок, а во вторых - наУчитесь, как надо отлаживать программы самостоятельно, а не бегая на форумы.
P.S. Посмотрел. Это не первый ваш вопрос на форуме, но столь-же элементарный. Тем более совет начать изучать Python для вас актуален.