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

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

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

я получил

  • Как определить, является ли файл двоичным (нетекстовым) в python?
  • Python - Чтение BLOB-типа из SQLite3 DB
  • Вставить двоичный файл в базу данных SQLite с помощью Python
  • открыть файл для чтения и записи?
  • Двоичные данные с pyserial (последовательный порт python)
  • Python OpenCV конвертирует изображение в байтовую строку?
  • ValueError: неверный литерал для int () с базой 10: 'F # \ x13'

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

  • Удаление пробелов и пустых строк из файла Использование Python
  • Преобразование csv-файла в словарь
  • Вставить двоичный файл в базу данных SQLite с помощью Python
  • Python - Чтение BLOB-типа из SQLite3 DB
  • Смущенный файловым файлом python «w +»
  • Сравнение двух разных файлов по строкам в python
  • 5 Solutions collect form web for “Чтение целых чисел из двоичного файла в Python”

    Метод 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' (<- это модификатор, который указывает порядок байтов младшего порядка и стандартный размер и выравнивание) – по умолчанию используется порядок байтов, размер и выравнивание байтов платформы). В соответствии с спецификацией формата BMP байты должны быть записаны в байтах Intel / little-endian.

    Альтернативным методом, который не использует «struct.unpack ()», является использование NumPy :

     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.

    Кроме 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)) 

    Начиная с Python 3.2+, вы также можете выполнить это, используя метод from_bytes int int:

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

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

    Python - лучший язык программирования в мире.