在Python中从二进制文件读取整数

103 投票
7 回答
187190 浏览
提问于 2025-04-15 13:04

我正在尝试用Python读取一个BMP文件。我知道文件的前两个字节表示BMP格式,接下来的四个字节是文件大小。当我执行以下代码时:

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

我得到了:

ValueError: invalid literal for int() with base 10: 'F#\x13'

我想做的是把那四个字节当作一个整数来读取,但看起来Python把它们当成字符来处理,返回了一个字符串,而这个字符串无法转换成整数。我该怎么正确地做到这一点呢?

7 个回答

38

从Python 3.2版本开始,你可以使用from_bytes这个内置的整数方法来实现这个功能:

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

需要注意的是,这个函数要求你指定数字是以大端格式还是小端格式编码的,所以你需要先搞清楚这个格式,以确保它能正确工作。

67

另一种不使用 '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 列表要快得多。

142

read 方法会把一串字节返回为一个字符串。如果你想把这个字符串中的字节序列转换成二进制数据,可以使用 Python 内置的 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/小端字节序的方式写入。

撰写回答