我正在尝试用Python读取BMP文件 . 我知道前两个字节表示BMP公司 . 接下来的4个字节是文件大小 . 当我执行:
fin = open("hi.bmp", "rb")
firm = fin.read(2)
file_size = int(fin.read(4))
我明白了:
ValueError:基数为10的int()的无效文字:'F#\ x13'
我想要做的是将这四个字节作为整数读取,但似乎Python将它们作为字符读取并返回一个字符串,该字符串无法转换为整数 . 我该怎么做才能正确?
6 回答
read
方法以字符串形式返回字节序列 . 要从字符串字节序列转换为二进制数据,请使用内置的struct
模块:http://docs.python.org/library/struct.html .请注意
unpack
始终返回一个元组,因此struct.unpack('i', fin.read(4))[0]
给出您所追求的整数值 .您应该使用格式字符串
'<i'
(<是一个修饰符,表示little-endian字节顺序和标准大小和对齐 - 默认是使用平台的字节顺序,大小和对齐) . 根据BMP格式规范,字节应以Intel / little-endian字节顺序写入 .不使用'struct.unpack()'的替代方法是使用NumPy:
'dtype'表示数据类型,可以是int#,uint#,float#,complex#或用户定义的类型 . 见numpy.fromfile .
个人更喜欢使用NumPy来处理数组/矩阵数据,因为它比使用Python列表快得多 .
从Python 3.2开始,您还可以使用from_bytes native int方法完成此操作:
请注意,此函数要求您指定数字是以大端还是小端格式编码,因此您必须确定字节序以确保其正常工作 .
除
struct
外,您还可以使用array
模块在阅读二进制文件时,需要将其解压缩为整数,因此请使用struct module
从二进制文件读取时,使用名为bytes的数据类型 . 这有点像列表或元组,除了它只能存储0到255之间的整数 .
尝试:
要么:
代替: