Подтвердить что ты не робот

Как читать байтовый файл байтом в Python и как печатать байтовое устройство как двоичное?

Я пытаюсь прочитать байтовый файл байтом, но я не уверен, как это сделать. Я пытаюсь сделать это так:

file = open(filename, 'rb')
while 1:
   byte = file.read(8)
   # Do something...

Так делает ли это, чтобы байт переменной содержал 8 следующих бит в начале каждого цикла? Не имеет значения, каковы эти байты. Единственное, что имеет значение, это то, что мне нужно прочитать файл в 8-битных стеках.

EDIT:

Также я собираю эти байты в списке, и я хотел бы их печатать так, чтобы они не печатались как символы ASCII, а как необработанные байты, то есть когда я печатаю этот bytelist, он дает результат как

['10010101', '00011100', .... ]
4b9b3361

Ответ 1

Чтобы ответить на вторую часть вашего вопроса, чтобы преобразовать в двоичный файл, вы можете использовать строку формата и ord:

>>> byte = 'a'
>>> '{0:08b}'.format(ord(byte))
'01100001'

Обратите внимание, что форматы прокладываются с правильным количеством ведущих нулей, что, кажется, является вашим требованием. Этот метод нуждается в Python 2.6 или новее.

Ответ 2

Чтобы прочитать один байт:

file.read(1)

8 бит - один байт.

Ответ 3

Показанный код будет читать 8 байтов. Вы можете использовать

with open(filename, 'rb') as f:
   while 1:
      byte_s = f.read(1)
      if not byte_s:
         break
      byte = byte_s[0]
      ...

Ответ 4

Там есть модуль python, специально предназначенный для чтения и записи в двоичные и закодированные данные, называемые struct '. Поскольку версии Python под 2.6 не поддерживают str.format, для создания двоичных форматированных строк необходимо использовать настраиваемый метод.

import struct

# binary string
def bstr(n): # n in range 0-255
    return ''.join([str(n >> x & 1) for x in (7,6,5,4,3,2,1,0)])

# read file into an array of binary formatted strings.
def read_binary(path):
    f = open(path,'rb')
    binlist = []
    while True:
        bin = struct.unpack('B',f.read(1))[0] # B stands for unsigned char (8 bits)
        if not bin:
            break
        strBin = bstr(bin)
        binlist.append(strBin)
    return binlist

Ответ 5

Поздняя вечеринка, но это может помочь любому, кто ищет быстрое решение:

вы можете использовать bin(ord('b')).replace('b', '') bin(), он дает вам двоичное представление с "b" после последнего бита, вы должны удалить его. Также ord() дает вам номер ASCII для символа char или 8 бит /1 байт.

Приветствия