对英文文本的字母进行huffman编码,heapq优先队列构建huffman树
python huffman.py source.txt result.txt
 import sys
import heapq
import collections class Node(object):
def __init__(self,value = None,count = 1,left = None,right = None, code = ''):
self.value = value
self.count = count
self.left = left
self.right = right
self.code = code def isleaf(self):
if self.left != None:
return False
elif self.right != None:
return False
else:
return True def __repr__(self):
return "Node(%r,%r)"%(self.value,self.count)
#for sort or priority queue
def __lt__(self,other):
return self.count < other.count
#for operator +
def __add__(self,other):
self.code = 0
other.code = 1
# only leaf node value is need
return Node(self.value+other.value,self.count+other.count,self,other) def getTreeRoot(text):
Counter = collections.Counter(text)
head = [Node(k,v) for (k,v) in Counter.items()]
heapq.heapify(head) while len(head) >= 2:
heapq.heappush(head, heapq.heappop(head) + heapq.heappop(head)) root = head[0]
return root def huffman(root, prefix = []):
code = {}
if root is None:
return code
prefix = prefix + [root.code]
if root.isleaf():
code[root.value] = prefix
else:
code.update(huffman(root.left,prefix))
code.update(huffman(root.right,prefix))
return code def gethuffmantext(text):
root = getTreeRoot(text)
codebook = huffman(root)
for k,v in codebook.items():
newv = "".join(str(char) for char in v)
codebook[k] = newv
print (codebook)
print("The original text size is {}".format(len(text) * 8))
huffmantext = []
lenhuffman = 0
for char in text:
lenhuffman += len(codebook[char])
huffmantext.append(codebook[char])
print ("The huffman code text size is {}".format(lenhuffman)) return huffmantext, codebook, lenhuffman def gettextfromhuffmancode(huffmantext,codebook): reversecodebook = {value:key for (key,value) in codebook.items()} text = []
for huffmancode in huffmantext:
text.append(reversecodebook[huffmancode]) return text if __name__ == "__main__":
text = open(sys.argv[1],"rb").read()
newfile = sys.argv[2]
#huffmantext, codebook, lenhuffman = gethuffmantext("hello world")
huffmantext, codebook, lenhuffman = gethuffmantext(text)
text1 = gettextfromhuffmancode(huffmantext,codebook)
text1 = "".join(str(v) for v in text1) lenoftext = len(text)*8.0
lenofhuffman = lenhuffman print ("The compression ratio is %lf \n" % (1.0 * lenhuffman / lenoftext )) fp = open(newfile,"wb")
fp.write(text1)
fp.close()

huffman编解码英文文本[Python]的更多相关文章

  1. 编解码原理,Python默认解码是ascii

    编解码原理,Python默认解码是ascii 首先我们知道,python里的字符默认是ascii码,英文当然没问题啦,碰到中文的时候立马给跪. 不知道你还记不记得,python里打印中文汉字的时候需要 ...

  2. base64编解码学习及python代码实现

    Base64是一种用64个字符来表示任意二进制数据的方法. Base64编码可以成为密码学的基石.可以将任意的二进制数据进行Base64编码.所有的数据都能被编码为并只用65个字符就能表示的文本文件. ...

  3. Python编解码问题与文本文件处理

    编解码器 在字符与字节之间的转换过程称为编解码,Python自带了超过100种编解码器,比如: ascii(英文体系) gb2312(中文体系) utf-8(全球通用) latin1 utf-16 编 ...

  4. python rsa 加密解密 (编解码,base64编解码)

    最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...

  5. python base64 编解码,转换成Opencv,PIL.Image图片格式

    二进制打开图片文件,base64编解码,转成Opencv格式: # coding: utf-8 import base64 import numpy as np import cv2 img_file ...

  6. python中的编解码小结

    在用python27写文件或者上传文件时遇到这样一个问题:.在网上搜了下说加入以下三行代码可以解决: import sys reload(sys) sys.setdefaultencoding('ut ...

  7. Huffman树及其编解码

    Huffman树--编解码 介绍:   Huffman树可以根据输入的字符串中某个字符出现的次数来给某个字符设定一个权值,然后可以根据权值的大小给一个给定的字符串编码,或者对一串编码进行解码,可以用于 ...

  8. Python 下JSON的两种编解码方式实例解析

    概念   JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写.在日常的工作中,应用范围极其广泛.这里就介绍python下它的两种编解码方法: ...

  9. 【听如子说】-python模块系列-AIS编解码Pyais

    Pyais Module Introduce pyais一个简单实用的ais编解码模块 工作中需要和ais打交道,在摸鱼的过程中发现了一个牛逼的模块,对ais编解码感兴趣的可以拿项目学习一下,或者运用 ...

随机推荐

  1. Java高并发秒杀API之高并发优化

    ---恢复内容开始--- 第1章 秒杀系统高并发优化分析   1.为什么要单独获得系统时间 访问cdn这些静态资源不用请求系统服务器 而CDN上没有系统时间,需要单独获取,获取系统时间不用优化,只是n ...

  2. jquery 兼容的滚轮事件

    // jquery 兼容的滚轮事件 $(document).on("mousewheel DOMMouseScroll", function (e) { ? : -)) || // ...

  3. DotNetBar TextBoxDropDown响应按键事件

    textBoxDropDownHelp.TextBox.KeyDown += new KeyEventHandler(textBoxDropDownHelp_KeyDown); private voi ...

  4. Java——Struts2 crud 简单实例(学习struts2和ssh) 用Myeclipse实现

    1.new web project 2.给新建的web项目添加struts2支持 3.项目结构中有了struts.xml和struts2核心库 4.编码 4.1项目结构图 4.2源代码: (1)DbU ...

  5. 20155205 2016-2017-2 《Java程序设计》第5周学习总结

    20155205 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 如果没有try的话,出现异常会导致程序崩溃,而try则可以保证程序的正常运行下去.( ...

  6. QDoubleSpinBox浮点型数字调节框

    样式: import sys from PyQt5.QtWidgets import QApplication, QWidget, QDoubleSpinBox class Demo(QWidget) ...

  7. CF418D Big Problems for Organizers

    传送门 题意,给一棵树,每次给两个点\(x,y\),求\(\max_{i=1}^{n}(\min(di_{x,i},di_{y,i}))\) 看std看了好久 以下是一个优秀的在线做法,\(O(nlo ...

  8. Mybatis进阶学习笔记——动态sql

    1.if标签 <select id="queryByNameAndTelephone" parameterType="Customer" resultTy ...

  9. SpringBoot整合日志

    Java日志 日志的接口层.抽象层 日志的实现 JCL(Jakarta Commons Logging) SLF4J(Simple Logging Facade for Java) Jboss-Log ...

  10. Software development skills for data scientists

    Software development skills for data scientists Data scientists often come from diverse backgrounds ...