【发布时间】:2013-11-17 23:10:39
【问题描述】:
对于 Python 3 编程任务,我必须使用 Huffman 编码。生成正确的代码很简单,这会导致一长串 0 和 1。
现在我的问题实际上是将此字符串写入二进制而不是文本。我试图这样做:
result = "01010101 ... " #really long string of 0's and 1's
filewrt = open(output_file, "wb") #appending b to w should write as binary, should it not?
filewrt.write(result)
filewrt.close()
但是我仍然得到一个 0 和 1 个字符的大文本文件。我该如何解决这个问题?
编辑:似乎我只是不明白如何在 Python 3 中表示任意位。
基于this SO question我设计了这个丑陋的怪物:
for char in result:
filewrt.write( bytes(int(char, 2)) )
它没有接近工作,而是输出了一个零文件,该文件是我的输入文件的两倍。有人可以向我解释如何任意表示二进制吗?在创建霍夫曼树的上下文中,如果我不应该使用字符串来连接或连接位,我该如何根据叶位置来连接或连接位。
【问题讨论】:
-
result是一个 Unicode 字符串,恰好包含0和1。将其写入二进制输出流是类型错误。你确定你没有在 Python 2 下运行它吗? -
您需要先将零和一转换回字节; Python 不会为你做这些。
-
@Mechanicalsnail 非常确定。我在 aptana 中明确定义了 Python3,这学期我一直在使用它,所以希望我是。
-
@MartijnPieters 我明白了。它需要一个特定的“字节”对象还是“字节数组”?我需要手动将这个字符串转换成什么类型的实例?
-
bytes类型用于表示任意字节数组。这可能是一个字符串,在这种情况下,.decode()会将其解码为一个 unicode 字符串,或者只是其他任何东西。在任何情况下,您都可以使用二进制操作对其进行操作,并使用索引访问单个字节。如果要将结构存储为二进制对象(例如树节点),还可以使用pickle进行bytes和 Python 对象之间的转换。