Чтение целых чисел из двоичного файла в 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 ответов:
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))