首页 文章

在Python中从二进制文件中读取整数

提问于
浏览
67

我正在尝试用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 回答

  • 6

    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' (<是一个修饰符,表示little-endian字节顺序和标准大小和对齐 - 默认是使用平台的字节顺序,大小和对齐) . 根据BMP格式规范,字节应以Intel / little-endian字节顺序写入 .

  • 8

    不使用'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列表快得多 .

  • 105

    从Python 3.2开始,您还可以使用from_bytes native int方法完成此操作:

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

    请注意,此函数要求您指定数字是以大端还是小端格式编码,因此您必须确定字节序以确保其正常工作 .

  • 38

    struct 外,您还可以使用 array 模块

    import array
    values = array.array('l') # array of long integers
    values.read(fin, 1) # read 1 integer
    file_size  = values[0]
    
  • 4

    在阅读二进制文件时,需要将其解压缩为整数,因此请使用struct module

    import struct
    fin = open("hi.bmp", "rb")
    firm = fin.read(2)  
    file_size, = struct.unpack("i",fin.read(4))
    
  • 0

    从二进制文件读取时,使用名为bytes的数据类型 . 这有点像列表或元组,除了它只能存储0到255之间的整数 .

    尝试:

    file_size = fin.read(4)
    file_size0 = file_size[0]
    file_size1 = file_size[1]
    file_size2 = file_size[2]
    file_size3 = file_size[3]
    

    要么:

    file_size = list(fin.read(4))
    

    代替:

    file_size = int(fin.read(4))
    

相关问题