Чтение целых чисел из двоичного файла в Python


Я пытаюсь читать BMP файл в Python. Я знаю первые два байта укажите фирму BMP. Следующие 4 байта-это размер файла. Когда я выполняю:

fin = open("hi.bmp", "rb")
firm = fin.read(2)  
file_size = int(fin.read(4))  

Я:

ValueError: недопустимый литерал для int () с основанием 10: 'F#x13'

что я хочу сделать, это прочитать эти четыре байта как целое число, но кажется, что Python читает их как символы и возвращает строку, которая не может быть преобразована в целое число. Как я могу сделать это правильно?

6 61

6 ответов:

The read метод возвращает последовательность байтов в строку. Для преобразования Строковой последовательности байтов в двоичные данные используйте встроенный struct модуль:http://docs.python.org/library/struct.html.

import struct

print(struct.unpack('i', fin.read(4)))

отметим, что unpack всегда возвращает кортеж, так struct.unpack('i', fin.read(4))[0] дает целочисленное значение, которое вы ищете.

вы, вероятно, должны использовать строку формата '<i' (

альтернативный метод, который не использует ' struct.распаковать()' было бы использовать включает в себя:

import numpy as np

f = open("file.bin", "r")
a = np.fromfile(f, dtype=np.uint32)

'dtype' представляет тип данных и может быть int#, uint#, float#, complex# или определенный пользователем тип. Смотрите numpy.fromfile.

лично предпочитаю использовать NumPy для работы с массивом / матричными данными, поскольку это намного быстрее, чем использование списков Python.

начиная с Python 3.2+, вы также можете выполнить это с помощью from_bytes родной метод int:

file_size = int.from_bytes(fin.read(2), byteorder='big')

за исключением struct вы также можете использовать array модуль

import array
values = array.array('l') # array of long integers
values.read(fin, 1) # read 1 integer
file_size  = values[0]

когда вы читаете двоичный файл, вам нужно распаковать его в целое число, поэтому используйте модуль struct для этого

import struct
fin = open("hi.bmp", "rb")
firm = fin.read(2)  
file_size, = struct.unpack("i",fin.read(4))

при чтении из двоичного файла используется тип данных, называемый байтами. Это немного напоминает список или кортеж, но может хранить только целые числа от 0 до 255.

попробуй:

file_size = fin.read(4)
file_size0 = file_size[0]
file_size1 = file_size[1]
file_size2 = file_size[2]
file_size3 = file_size[3]

или:

file_size = list(fin.read(4))

вместо:

file_size = int(fin.read(4))