2010-05-20 3 views
21

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

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

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

EDIT:

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

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

Используйте 'while True:' вместо 'while 1:'. –

+0

Этот вопрос очень похож на http://stackoverflow.com/questions/1035340/reading-binary-file-in-python. –

ответ

18

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

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

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

28

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

file.read(1) 

8 бит занимает один байт.

+1

Спасибо. Я думал, что file.read (1) будет читать только один бит, но кажется, что он читает один байт. – zaplec

14

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

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

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

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 
+1

Если вы используете его только для одного символа, вам лучше использовать 'ord (f.read (1))' вместо 'struct.unpack ('B', f.read (1)) [0] '? (Вам нужно сделать что-то вроде 'c = f.read (1), если не c: break; binlist.append (bstr (ord (c))).). –

0

Late к партии, но это может помочь, кто ищет быстрое решение:

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

Cheers

Смежные вопросы