Как читать байтовый файл байтом в Python и как печатать байтовое устройство как двоичное?
Я пытаюсь прочитать байтовый файл байтом, но я не уверен, как это сделать. Я пытаюсь сделать это так:
file = open(filename, 'rb')
while 1:
byte = file.read(8)
# Do something...
Так делает ли это, чтобы байт переменной содержал 8 следующих бит в начале каждого цикла? Не имеет значения, каковы эти байты. Единственное, что имеет значение, это то, что мне нужно прочитать файл в 8-битных стеках.
EDIT:
Также я собираю эти байты в списке, и я хотел бы их печатать так, чтобы они не печатались как символы ASCII, а как необработанные байты, то есть когда я печатаю этот bytelist, он дает результат как
['10010101', '00011100', .... ]
Ответы
Ответ 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 байт.
Приветствия