我正在尝试用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似乎将它们作为字符读取并返回一个字符串,该字符串无法转换为整数。我如何才能正确地执行此操作?
发布于 2009-07-22 06:59:55
read
方法以字符串形式返回一个字节序列。要将字符串字节序列转换为二进制数据,请使用内置的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/little-endian字节顺序写入。
发布于 2012-07-30 05:51:49
另一种不使用“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列表快得多。
发布于 2017-05-09 05:33:15
从Python开始,您也可以使用from_bytes
原生3.2+方法来完成此操作:
file_size = int.from_bytes(fin.read(2), byteorder='big')
请注意,此函数要求您指定数字是以高字节顺序格式编码还是以低字节顺序格式编码,因此您必须确定字节顺序以确保其正常工作。
https://stackoverflow.com/questions/1163459
复制相似问题