对英文文本的字母进行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. POJ - 1426 Find The Multiple(搜索+数论)

    转载自:優YoU  http://user.qzone.qq.com/289065406/blog/1303946967 以下内容属于以上这位dalao http://poj.org/problem? ...

  2. UVALive 4725 Airport(二分)

    题目链接 题意 机场有两种飞机,每小时一些飞机到达,每小时安排一架飞机起航.求任意时刻中两种飞机数目的最大值的最小值. 分析 首先肯定是二分来做.这里的难点在于如何判断飞机数目是否合法.一开始忽略了某 ...

  3. SSH 互信

    A:master B:server 在A B机器 当前用户的绝对目录 进行创建 .ssh  # mkdir ~/.ssh# chmod 700 .ssh/# /usr/bin/ssh-keygen - ...

  4. Linux之更改Nginx映射默认根目录

     更改nginx映射默认根目录: 1.打开默认配置文件:sudo  vi /etc/nginx/sites-available/default 2.修改配置:root /var/www/html/xx ...

  5. CTSC&APIO2018游记

    Day-1 布吉岛干什么,好像只看了Splay Day0 再次布吉岛干什么,好像也只看了Splay 然后上了火车 wc没买方便面,只能吃40元的盒饭 半夜睡不着,那应该是我太菜了 Day1 九点下火车 ...

  6. k8s系列~mgr的应用

    一  简介:今天咱们大体介绍下 这两者是如何联系的二  概念解析     pod:说下我的理解    1 pod通过yaml文件来封装docker本身+启动形式    2 pod可以运行多个docke ...

  7. vue UI框架

    一.pc端 element UI 饿了么UI支持vue2.x80分优点:组件的API方法.属性等封装的较为完善缺点:样式有些生硬,不够炫酷美观 N3 N3支持vue2.x70分优点:组件操作几乎都有动 ...

  8. Mybatis入门学习笔记

    1.定义别名 在sqlMapConfig.xml中,编写如下代码: <!-- 定义别名 --> <typeAliases> <!-- type: 需要映射的类型 alia ...

  9. C#的五种访问修饰符

    简述: 所有类型和类型成员都具有可访问性级别,用来控制是否可以在您程序集的其他代码中或其他程序集中使用它们. 可使用访问修饰符指定声明类型或成员的可访问性. 在C#语言中,共有五种访问修饰符:publ ...

  10. nodejs xpath

    var fs = require('fs');var xpath = require('xpath');var dom = require('xmldom').DOMParser; // Read t ...