def generate_codes(self) -> Dict[int, Deque[bool]]: """ Reads the whole input file and generates coding_table by the Huffman tree :return: coding table where key is byte and value is deque of bits """ self.input_file.seek(0) freq_table = {} while True: input_buffer = self.input_file.read(INPUT_BUFFER_SIZE) if not input_buffer: break for byte in input_buffer: if byte in freq_table: freq_table[byte] += 1 else: freq_table[byte] = 1 tree = HuffmanTree(freq_table) return tree.generate_codes()
def generate_codes(self) -> Dict[int, Deque[bool]]: """ Reads the whole input file and generates coding_table by the Huffman tree :return: coding table where key is byte and value is deque of bits """ self.input_file.seek(0) # переключаемся на первый байт входного файла freq_table = { } # создаём пустую мапу частот, в котоорую в дальнейшем будем её записывать while True: input_buffer = self.input_file.read( INPUT_BUFFER_SIZE ) # считываем и помещаем данные из инпут файла в буффер (в память) if not input_buffer: # если ничего не считалось, т.е. файл пустой - выходим break for byte in input_buffer: # если считались данные, перебираем каждый байт этого файла if byte in freq_table: # если данный байт уже есть в таблице частот, инкрементируем его значение freq_table[byte] += 1 else: # если данного байта ещё нет в таблице частот, значит нужно его добавить и присвоить 1, как количество повторений freq_table[byte] = 1 tree = HuffmanTree( freq_table ) # строим дерево после формирования таблицы частот (внутри простроится дерево, и вернем коды которые получатся для каждого символа) return tree.generate_codes() # возвращаем построенные коды