Предполагая, что у вас достаточно памяти, вы можете преобразовать instream в список битов и затем нарезать его по своему усмотрению.
def access_bit(data, num):
base = int(num/8)
shift = num % 8
return (data[base] & (1<<shift)) >> shift
def to_bits(instream):
ba = bytearray(instream.read())
return [access_bit(ba,i) for i in range(len(ba)*8)]
>>>to_bits(open('test.txt','rb'))
[0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0]
В противном случае вам придется читать меньшие куски, кратные размеру, который вы хотите, а затем использовать вышеуказанный метод для каждого.Например, вы читаете 22 * 4 = 88 бит или 11 байтов, а затем вызываете to_bits для этого, разбиваете полученный массив на 4 22-битных блока и повторяете.