文件压缩程序的设计与实现代码

时间: 2023-12-29 15:51:51 浏览: 30
以下是一个简单的文件压缩程序的设计与实现代码,采用哈夫曼编码进行压缩: ```python import heapq import os class HuffmanNode: def __init__(self, value=None, freq=0): self.left = None self.right = None self.value = value self.freq = freq def __lt__(self, other): return self.freq < other.freq class HuffmanTree: def __init__(self, data): self.root = None self.freq = {} self.data = data def build_tree(self): for d in self.data: if d not in self.freq: self.freq[d] = 1 else: self.freq[d] += 1 h = [] for key in self.freq: heapq.heappush(h, HuffmanNode(key, self.freq[key])) while len(h) > 1: left = heapq.heappop(h) right = heapq.heappop(h) node = HuffmanNode(None, left.freq + right.freq) node.left = left node.right = right heapq.heappush(h, node) self.root = heapq.heappop(h) def get_codes(self): codes = {} self._get_codes(self.root, '', codes) return codes def _get_codes(self, node, code, codes): if node.value: codes[node.value] = code return self._get_codes(node.left, code + '0', codes) self._get_codes(node.right, code + '1', codes) class Compressor: def __init__(self, filename): self.filename = filename self.file_size = os.path.getsize(filename) self.data = None self.codes = None self.encoded_data = None self.padding = None def compress(self): with open(self.filename, 'rb') as f: self.data = f.read() ht = HuffmanTree(self.data) ht.build_tree() self.codes = ht.get_codes() encoded_bits = '' for d in self.data: encoded_bits += self.codes[d] self.padding = 8 - len(encoded_bits) % 8 encoded_bits += '0' * self.padding self.encoded_data = bytearray() for i in range(0, len(encoded_bits), 8): byte = encoded_bits[i:i+8] self.encoded_data.append(int(byte, 2)) with open(self.filename + '.compressed', 'wb') as f: f.write(bytes([self.padding])) f.write(self.encoded_data) print(f'Compressed {self.filename} from {self.file_size} bytes to {len(self.encoded_data)} bytes.') def decompress(self): with open(self.filename + '.compressed', 'rb') as f: self.padding = int.from_bytes(f.read(1), byteorder='big') self.encoded_data = f.read() encoded_bits = '' for b in self.encoded_data: encoded_bits += bin(b)[2:].rjust(8, '0') encoded_bits = encoded_bits[:-self.padding] codes = {v: k for k, v in self.codes.items()} decoded_data = '' i = 0 while i < len(encoded_bits): j = i + 1 while encoded_bits[i:j] not in codes and j <= len(encoded_bits): j += 1 decoded_data += codes[encoded_bits[i:j]] i = j with open(self.filename + '.decompressed', 'wb') as f: f.write(decoded_data.encode()) print(f'Decompressed {self.filename} to {len(decoded_data)} bytes.') ``` 使用示例: ```python c = Compressor('test.txt') c.compress() c.decompress() ``` 其中,`test.txt` 是需要压缩的文件名,程序将会生成 `test.txt.compressed` 作为压缩后的文件,以及 `test.txt.decompressed` 作为解压缩后的文件。

相关推荐

最新推荐

recommend-type

python实现图片批量压缩程序

本文实例为大家分享了python实现图片批量压缩程序的具体代码,供大家参考,具体内容如下 说明 运行环境:Win10 Pycharm 程序没有用到面向对象编程方法,只是简单的面向过程设计 用到的模块:PIL、os、sys 使用...
recommend-type

基于Pyinstaller打包Python程序并压缩文件大小

主要介绍了基于Pyinstaller打包Python程序并压缩文件大小,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
recommend-type

哈夫曼编码算法与分析(java实现)

1.哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法。给出文件中各个字符出现的频率,求各个字符的哈夫曼编码方案。
recommend-type

python暴力破解加密的压缩文件(二)

应用Python程序设计语言的相关知识,对加密的压缩文件进行破解。 二、实验内容 任务1:定义一个函数,函数带有一个参数L(类型为整数),函数返回一个长度为L、包含大小写字母和数字的随机密码(类型为字符串)。 ...
recommend-type

哈弗曼压缩解压程序源代码及注释

是1952年为文本文件建立的,其基本原理是频繁使用的数据用较短的代码代替,很少使用的数据用较长的代码代替,每个数据的代码各不相同。这些代码都是二进制码,且码的长度是可变的。如: 有一个原始数据序列,ABACCDAA...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用matlab绘制高斯色噪声情况下的频率估计CRLB,其中w(n)是零均值高斯色噪声,w(n)=0.8*w(n-1)+e(n),e(n)服从零均值方差为se的高斯分布

以下是用matlab绘制高斯色噪声情况下频率估计CRLB的代码: ```matlab % 参数设置 N = 100; % 信号长度 se = 0.5; % 噪声方差 w = zeros(N,1); % 高斯色噪声 w(1) = randn(1)*sqrt(se); for n = 2:N w(n) = 0.8*w(n-1) + randn(1)*sqrt(se); end % 计算频率估计CRLB fs = 1; % 采样频率 df = 0.01; % 频率分辨率 f = 0:df:fs/2; % 频率范围 M = length(f); CRLB = zeros(M,1); for
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。