【发布时间】:2022-01-01 21:20:07
【问题描述】:
我正在做一个学校项目,这是我的问题:
生成一个二进制文件,其中包含编码表和 使用 Huffman 编码的文件数据。
首先,我需要从文件中读取数据并创建一棵 Huffman 树,因此我创建了它并且一切正常,但我无法生成二进制文件,因为我拥有的数据是节点而不是对象,所以我不能将数据放入二进制文件中,我收到此错误:
TypeError: a bytes-like object is required, not 'node'
q = {}
a_file = open("george.txt", 'r')
for line in a_file:
key, value = line.split()
q[key] = value
class node:
def __init__(self, freq, symbol, left=None, right=None):
self.freq = freq
self.symbol = symbol
self.left = left
self.right = right
self.huff = ''
def printNodes(node, val=''):
newVal = val + str(node.huff)
if(node.left):
printNodes(node.left, newVal)
if(node.right):
printNodes(node.right, newVal)
if(not node.left and not node.right):
print(f"{node.symbol} -> {newVal}")
chars = ['a', 'b', 'c', 'd', 'e', 'f']
# frequency of characters
freq = [q['a'], q['b'], q['c'], q['d'], q['e'], q['f']]
nodes = []
for x in range(len(chars)):
nodes.append(node(freq[x], chars[x]))
while len(nodes) > 1:
nodes = sorted(nodes, key=lambda x: x.freq)
left = nodes[0]
right = nodes[1]
left.huff = 0
right.huff = 1
newNode = node(left.freq+right.freq, left.symbol+right.symbol, left, right)
nodes.remove(left)
nodes.remove(right)
nodes.append(newNode)
printNodes(nodes[0])
with open('binary.bin', 'wb') as f:
f.write(nodes[0])
【问题讨论】:
-
霍夫曼编码是一种压缩算法。输出文件应小于输入文件。我怀疑给定的答案就是这种情况。