1. Кодировщик
Кодировщик читает текстовый файл, создает его кодировку с помощью алгоритма Хаффмана и записывает сжатый файл.
import heapq
from collections import defaultdict, namedtuple
class Node(namedtuple('Node', ['char', 'freq'])):
def __lt__(self, other):
return self.freq < other.freq
def build_huffman_tree(text):
frequency = defaultdict(int)
for char in text:
frequency[char] += 1
priority_queue = [Node(char, freq) for char, freq in frequency.items()]
heapq.heapify(priority_queue)
while len(priority_queue) > 1:
left = heapq.heappop(priority_queue)
right = heapq.heappop(priority_queue)
combined = Node(None, left.freq + right.freq)
heapq.heappush(priority_queue, combined)
return priority_queue[0]
def build_codes(node, prefix="", codebook={}):
if node.char is not None:
codebook[node.char] = prefix
else:
build_codes(node.left, prefix + "0", codebook)
build_codes(node.right, prefix + "1", codebook)
return codebook
def encode(text, codebook):
return ''.join(codebook[char] for char in text)
def compress_file(input_file, output_file):
with open(input_file, 'r', encoding='utf-8') as file:
text =
file.read ()
huffman_tree = build_huffman_tree(text)
codebook = build_codes(huffman_tree)
encoded_text = encode(text, codebook)
with open(output_file, 'wb') as file:
# Сохраняем кодировку
file.write(bytes(str(codebook), 'utf-8') + b'\n')
# Сохраняем закодированный текст
file.write(int(encoded_text, 2).to_bytes((len(encoded_text) + 7) // 8, byteorder='big'))
# Пример использования
compress_file('input.txt', 'compressed.bin')
2. Декодировщик
Декодировщик читает сжатый файл, восстанавливает кодировку и декодирует текст.
def decode(encoded_text, codebook):
reverse_codebook = {v: k for k, v in codebook.items()}
current_code = ''
decoded_text = ''
for bit in encoded_text:
current_code += bit
if current_code in reverse_codebook:
decoded_text += reverse_codebook[current_code]
current_code = ''
return decoded_text
def decompress_file(input_file, output_file):
with open(input_file, 'rb') as file:
# Считываем кодировку
codebook_data = file.readline().decode('utf-8')
codebook = eval(codebook_data.strip())
# Считываем закодированный текст
encoded_bytes =
file.read ()
encoded_text = bin(int.from_bytes(encoded_bytes, byteorder='big'))[2:]
# Убираем ведущие нули
encoded_text = encoded_text.zfill(len(encoded_text) + 8 - len(encoded_text) % 8)
decoded_text = decode(encoded_text, codebook)
with open(output_file, 'w', encoding='utf-8') as file:
file.write(decoded_text)
# Пример использования
decompress_file('compressed.bin', 'output.txt')
1 часть:
Кодировщик. На вход кодировщика подаётся обычный текстовый файл с каким то содержимым.Подав этот файл в кодировщик, используем какие то методы. (методы сжатия файла без потерь) Преобразовать файл так, чтобы он стал меньше по размеру, чем исходный файл, при этом его структура может поменятся. На выходе будет новый файл, который будет меньше чем исходный.
2 часть:
Обратное преобразование: нужно взять сжатый файл и декодировать, то есть выполнить обратное преобразование, чтобы на выходе получили ровно такой же файл, который был в начале.
ПОМОГИТЕ ПОЖАЛУЙСТА?????? это на автомат по инфе нужно