纯python-huffman编解码模块

dahuffman的Python项目详细描述


https://img.shields.io/travis/soxofaan/dahuffman/master.svghttps://img.shields.io/badge/license-MIT-blue.svg

dahuffman是一个用于huffman编码和解码的纯python模块, 常用于无损数据压缩。

模块的名称是指发明人的全名 哈夫曼编码树算法:大卫艾伯特哈夫曼(1925年8月9日-1999年10月7日)。

功能和设计

  • 纯python实现,仅使用标准库。
  • 内部利用迭代器和生成器,允许以流式方式使用。
  • 不限于字节/Unicode字符串输入,可以处理其他“符号”或标记, 例如象棋移动或分类数据序列,只要这些符号 可以用作字典中的键(意味着它们应该是散列的)。
  • 如果编码比特流的结尾不与字节边界对齐,请正确处理它
  • 同时支持Python2.7和Python3.6

安装

待办事项

用法

基本用法示例,其中代码表是基于给定的符号频率构建的:

>>> from dahuffman import HuffmanCodec
>>> codec = HuffmanCodec.from_frequencies({'e': 100, 'n':20, 'x':1, 'i': 40, 'q':3})
>>> encoded = codec.encode('exeneeeexniqneieini')
>>> encoded
'\x86|%\x13i@'
>>> len(encoded)
6
>>> codec.decode(encoded)
'exeneeeexniqneieini'
>>> codec.print_code_table()
bits  code       (value)  symbol
   5  00000      (    0)  _EOF
   1  1          (    1)  'e'
   2  01         (    1)  'i'
   3  001        (    1)  'n'
   4  0001       (    1)  'q'
   5  00001      (    1)  'x'

您也可以通过直接提供数据来“训练”编解码器:

>>> codec = HuffmanCodec.from_data('hello world how are you doing today foo bar lorem ipsum')
>>> codec.encode('do lo er ad od')
'^O\x1a\xc4S\xab\x80'
>>> len(_)
7

与符号序列一起使用(本例中为国家代码):

>>> countries = ['FR', 'UK', 'BE', 'IT', 'FR', 'IT', 'GR', 'FR', 'NL', 'BE', 'DE']
>>> codec = HuffmanCodec.from_data(countries)
>>> encoded = codec.encode(['FR', 'IT', 'BE', 'FR', 'UK'])
>>> encoded
'L\xca'
>>> len(encoded)
2
>>> codec.decode(encoded)
['FR', 'IT', 'BE', 'FR', 'UK']

以流媒体方式执行(生成器):

>>> import random
>>> def sample(n, symbols):
...     for i in range(n):
...             if (n-i) % 5 == 1:
...                     print(i)
...             yield random.choice(symbols)
...
>>> codec = HuffmanCodec.from_data(countries)
>>> encoded = codec.encode_streaming(sample(16, countries))
>>> encoded
<generator object encode_streaming at 0x108bd82d0>
>>> decoded = codec.decode_streaming(encoded)
>>> decoded
<generator object decode_streaming at 0x108bd8370>
>>> list(decoded)
0
5
10
15
['DE', 'BE', 'FR', 'GR', 'UK', 'BE', 'UK', 'IT', 'UK', 'FR', 'DE', 'IT', 'NL', 'IT', 'FR', 'UK']

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java能否使用OpenJPA将一个实体持久化到多个持久化单元?   java如何访问当前按下的键   java singleton是否意味着哈希代码总是返回相同的值?   inputstream无法在Java中同时使用STDIN和STDERR读取程序输出   java运行时有多贵。getRuntime()与获取内存度量相结合   java AndroidStudio ListView适配器更新   java小程序请求未扩展实时会话   java是设置布尔值所必需的关键部分?   java比较两个字符串,并突出显示发现的不匹配项   java带抽屉布局,无论哪个屏幕处于活动状态,如何在按下后退键时关闭应用程序?   爪哇:颜色有什么区别。黑色和彩色。黑色   Velocity模板中子类的java访问方法   java如何快速学习Drools或其他规则引擎   从Java应用程序访问时缓存数据库查询结果   java cassandra nodetool JPLISAgent。c错误   java我正在解析一个没有pubDate的RSS提要,有没有其他方法可以确定一个项目是何时发布的?