Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Задача Python. Кодировщик и обратное преобразование

Лера Чупахина Ученик (121), открыт 2 дня назад
Разработать свой собственный формат файла, который бы содержал исходный текстовый файл, при этом сжатый.
1 часть:
Кодировщик. На вход кодировщика подаётся обычный текстовый файл с каким то содержимым.Подав этот файл в кодировщик, используем какие то методы. (методы сжатия файла без потерь) Преобразовать файл так, чтобы он стал меньше по размеру, чем исходный файл, при этом его структура может поменятся. На выходе будет новый файл, который будет меньше чем исходный.
2 часть:
Обратное преобразование: нужно взять сжатый файл и декодировать, то есть выполнить обратное преобразование, чтобы на выходе получили ровно такой же файл, который был в начале.

ПОМОГИТЕ ПОЖАЛУЙСТА?????? это на автомат по инфе нужно
2 ответа
Русич Богдановичь Ученик (185) 2 дня назад
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')
ㅤㅤㅤㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤМыслитель (5473) 2 дня назад
Ой чувак, тут в принципе рассчитана только на текст...
ㅤㅤㅤㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ Мыслитель (5473) 2 дня назад
На гитхабе давно есть утилиты сжимающие файлы на питоне..., проект относительно средней сложности и требует знаний матеши(хороших)
Если использовать алгоритм хаффмана, то люди обычно предполагают что значение символов в алфавите будет одинаковой длины:8 символов(байт).
Ну в неаотррых случаях иногда рациональней разбивать не равномерно, в связи тпм что некоторые последовательности минут встречаться гораздо чаще, чем последовательности из 8 бит
А кстати, исходники 7-zip архиватора есть же, можно смотреть алгоритм, и переписать его на питон, правда там assembler вставки есть в исходниках..
Он тебе слодный задачу поставил
ПапаВысший разум (144970) 2 дня назад
Они скоро сюда будут приходить с просьбами написать им диссертацию.
ㅤㅤㅤㅤㅤㅤ ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ Мыслитель (5473) Папа, да она видимо не понимает сама не понимает сто от нее препод хочет;)
Похожие вопросы