用Python中的二进制文件读取整数

我正在尝试在Python中读取BMP文件。 我知道前两个字节表示BMP公司。 接下来的4个字节是文件大小。 当我执行时:

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

我明白了

ValueError:int()与基数10的无效文字:'F#\ x13'

我想要做的就是将这四个字节作为一个整数来读取……看来Python正在将它们读作字符并返回一个不能转换为整数的string。 我如何正确地做到这一点?

read方法以stringforms返回一个字节序列。 要从string字节序列转换为二进制数据,请使用内置的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]给出了你之后的整数值。

您应该使用格式string'<i' (<是一个修饰符,指示little-endian字节顺序和标准大小和alignment – 默认是使用平台的字节顺序,大小和alignment)。 根据BMP格式规范,字节应该以Intel / little-endian字节顺序写入。

另一种不使用“struct.unpack()”的方法是使用NumPy :

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

'dtype'表示数据types,可以是int#,uint#,float#,complex#或用户定义的types。 请参阅numpy.fromfile

个人更喜欢使用NumPy来处理数组/matrix数据,因为它比使用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 native int方法完成此操作:

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

请注意,这个函数需要你指定数字是以big还是little-endian格式编码的,所以你必须确定endian-ness以确保它能正常工作。