纯python-huffman编解码模块
dahuffman的Python项目详细描述
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']