用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以确保它能正常工作。