在Python中从二进制文件读取整数
我正在尝试用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 个回答
从Python 3.2版本开始,你可以使用from_bytes
这个内置的整数方法来实现这个功能:
file_size = int.from_bytes(fin.read(2), byteorder='big')
需要注意的是,这个函数要求你指定数字是以大端格式还是小端格式编码的,所以你需要先搞清楚这个格式,以确保它能正确工作。
另一种不使用 '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 列表要快得多。
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/小端字节序的方式写入。