Как сохранить двоичные 1 и 0 в виде битов, а не байтов в файле в python3? - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь выполнить сжатие файлов, используя кодировку Хаффмана в 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

Мой выход следующим образом:

110111001110111001110111001110111001110101000011011011011110101001111011001101110100111101101111011100011110110111101011111101010111010000011011101011101101111011101111011110111011001101001101110100011101111011101101010110

* +1009 * проблема состоит в каждой из 1 и 0 сохраняются в виде символов от 4 байты каждый, и я хочу, чтобы они были сохранены как биты

1 Ответ

0 голосов
/ 03 мая 2020

Вы не включаете код, в котором сохраняете его в файл, поэтому я не могу сказать наверняка. Однако я могу сделать предположение здесь.

Возможно, вы забыли собрать вместе 1 и 0 коды. Вам, вероятно, потребуется использовать тип bytes или bytearray (см. здесь для документации) и использовать побитовые операторы (см. здесь для информации), чтобы сдвинуть и упаковать 8 ваших коды в каждый byte перед сохранением его в файл.

Помните о порядке следования битов, когда вы упаковываете коды в bytes.

Я не использовал их, но Вы можете найти полезную процедуру pack. См. здесь для информации.

...