如何将二进制 1 和 0 作为位而不是字节存储在 python3 的文件中?
How do i store binary 1s and 0s as bits rather than bytes in a file in python3?
我正在尝试使用霍夫曼编码在 python 中进行文件压缩,并且我已经成功地为文件中的每个唯一字符构建了代码。现在,当我用这段代码对原始文件进行编码时,它会生成一个 1 和 0 的序列。但是每个字符占用一个字节,我想知道如何存储代码,以便每个 1 和 0 都存储为位而不是 python3 中的字节,这实际上会减少文件大小。
#This is the file i redirect my output to
sys.stdout=open("./input2.txt","w")
#Tree for storing the code
class Tree:
__slots__=["left","right","val","c"]
def __init__(self,val,c):
self.val=val
self.c=c
self.left=self.right=None
def value(self):
return (self.val,self.c)
#Tree is a list of tree nodes. Initially it is a list where each
#character is a seperate tree.
def construct(tree):
while(len(tree)>1):
left=_heapq.heappop(tree)
right=_heapq.heappop(tree)
root=(left[0]+right[0],left[1]+right[1],Tree(left[0]+right[0],left[1]+right[1]))
root[2].left=left[2]
root[2].right=right[2]
_heapq.heappush(tree,root)
return tree
#This function generates the code for the characters in the tree which
#is the 'root' argument and 'code' is an empty String
#'codes' is the map for mapping character with its code
def Print(root,code,codes):
if(root.left==None and root.right==None):
codes[root.c]=code
return
Print(root.left,code+'0',codes)
Print(root.right,code+'1',codes)
#This function encodes the 'compressed' string with the 'codes' map
def encode(compressed,codes):
document=''.join(list(map(lambda x:codes[x],compressed)))
return document
My output is like this:
110111001110111001110111001110111001110101000011011011011110101001111011001101110100111101101111011100011110110111101011111101010111010000011011101011101101111011101111011110111011001101001101110100011101111011101101010110
问题是每个 1 和 0 都存储为 字符 每个 4 字节 我希望它们被存储作为位
您没有将代码保存到文件中,所以我不能肯定。但是我可以在这里猜测。
您可能忘记将 1 和 0 代码打包在一起。在将代码存储到文件。
注意将代码打包到 bytes
中的位顺序。
我没有使用过这些,但您可能会发现 pack
例程很有用。有关信息,请参阅 here。
我正在尝试使用霍夫曼编码在 python 中进行文件压缩,并且我已经成功地为文件中的每个唯一字符构建了代码。现在,当我用这段代码对原始文件进行编码时,它会生成一个 1 和 0 的序列。但是每个字符占用一个字节,我想知道如何存储代码,以便每个 1 和 0 都存储为位而不是 python3 中的字节,这实际上会减少文件大小。
#This is the file i redirect my output to
sys.stdout=open("./input2.txt","w")
#Tree for storing the code
class Tree:
__slots__=["left","right","val","c"]
def __init__(self,val,c):
self.val=val
self.c=c
self.left=self.right=None
def value(self):
return (self.val,self.c)
#Tree is a list of tree nodes. Initially it is a list where each
#character is a seperate tree.
def construct(tree):
while(len(tree)>1):
left=_heapq.heappop(tree)
right=_heapq.heappop(tree)
root=(left[0]+right[0],left[1]+right[1],Tree(left[0]+right[0],left[1]+right[1]))
root[2].left=left[2]
root[2].right=right[2]
_heapq.heappush(tree,root)
return tree
#This function generates the code for the characters in the tree which
#is the 'root' argument and 'code' is an empty String
#'codes' is the map for mapping character with its code
def Print(root,code,codes):
if(root.left==None and root.right==None):
codes[root.c]=code
return
Print(root.left,code+'0',codes)
Print(root.right,code+'1',codes)
#This function encodes the 'compressed' string with the 'codes' map
def encode(compressed,codes):
document=''.join(list(map(lambda x:codes[x],compressed)))
return document
My output is like this:
110111001110111001110111001110111001110101000011011011011110101001111011001101110100111101101111011100011110110111101011111101010111010000011011101011101101111011101111011110111011001101001101110100011101111011101101010110
问题是每个 1 和 0 都存储为 字符 每个 4 字节 我希望它们被存储作为位
您没有将代码保存到文件中,所以我不能肯定。但是我可以在这里猜测。
您可能忘记将 1 和 0 代码打包在一起。在将代码存储到文件。
注意将代码打包到 bytes
中的位顺序。
我没有使用过这些,但您可能会发现 pack
例程很有用。有关信息,请参阅 here。