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

问题描述 投票:0回答:7

我正在尝试用 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似乎将它们作为字符读取并返回一个字符串,该字符串无法转换为整数。我怎样才能正确地做到这一点?

python file binary integer
7个回答
143
投票

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'
(< is a modifier that indicates little-endian byte-order and standard size and alignment - the default is to use the platform's byte ordering, size and alignment). According to the BMP format spec, the bytes should be written in Intel/little-endian byte order.


69
投票

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


38
投票

从 Python 3.2+ 开始,您还可以使用

from_bytes
原生 int 方法来完成此操作:

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

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


6
投票

除了

struct
你还可以使用
array
模块

import array
values = array.array('l') # array of long integers
values.fromfile(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))

1
投票

从二进制文件读取时,会使用称为字节的数据类型。这有点像列表或元组,只不过它只能存储 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))

-1
投票

这是一个迟来的解决方案,但我认为它可能会有所帮助。

fin = open("hi.bmp", "rb")
firm = fin.read(2)
file_size = 0
for _ in range(4):  
    (file_size << 8) += ord(fin.read(1))
© www.soinside.com 2019 - 2024. All rights reserved.