我正在做一個學校專案,這是我的問題:
使用霍夫曼編碼生成包含編碼表和檔案資料的二進制檔案。
首先,我需要從檔案中讀取資料并創建一個霍夫曼樹,所以我創建了它并且一切正常,但是我無法生成二進制檔案,因為我擁有的資料是節點而不是物件,因此我無法放置資料在二進制檔案中,我收到此錯誤:
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])
uj5u.com熱心網友回復:
將結構化物件轉換為二進制形式的程序稱為“序列化”,因此您通常希望從搜索“python 序列化”開始。它是大多數編程語言的組成部分,有多種形式。python中事實上的序列化方法叫做Pickle,在python包中 pickle。
Pickle 允許您將物件轉換為二進制表示,反之亦然,為您處理許多小的協議細節。
在您的示例中,您有:
with open('binary.bin', 'wb') as f:
f.write(nodes[0])
您可以將其序列化為二進制形式,如下所示:
import pickle
with open('binary.bin', 'wb') as f:
b = pickle.dumps(nodes[0]) # bytes representation of your object
f.write(b) # you can now write the bytes
您還可以使用諸如以下的速記方法將所有節點保存在一行中:
pickle.dump('binary.bin', nodes)
反序列化看起來很相似:
with open('binary.bin', 'rb') as f:
b = f.read()
node0 = pickle.loads(b)
或者
nodes = pickle.load('binary.bin')
下面是一些相關的帖子:
- 理解 Python 中的酸洗
- Python 序列化 - 為什么選擇pickle?
- 如何使用泡菜來保存字典?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/400682.html
上一篇:修復從排序鏈表中洗掉重復項的錯誤
