Как прочитать файл побайтно в Python и как распечатать файл в виде двоичного файла? - PullRequest
25 голосов
/ 20 мая 2010

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

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

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

EDIT:

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

['10010101', '00011100', .... ]

Ответы [ 5 ]

36 голосов
/ 20 мая 2010

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

file.read(1)

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

18 голосов
/ 20 мая 2010

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

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

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

15 голосов
/ 20 мая 2010

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

with open(filename, 'rb') as f:
   while 1:
      byte_s = f.read(1)
      if not byte_s:
         break
      byte = byte_s[0]
      ...
2 голосов
/ 24 августа 2011

Существует модуль 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
0 голосов
/ 26 мая 2014

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

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

Приветствия

...