2009-07-22 149 views
54

我试图在Python中读取BMP文件。我知道前两个字节 表示BMP公司。接下来的4个字节是文件大小。当我excecute:从Python中的二进制文件中读取整数

fin = open("hi.bmp", "rb") 
firm = fin.read(2) 
file_size = int(fin.read(4)) 

我得到

ValueError: invalid literal for int() with base 10: 'F#\x13'

我想要做的就是阅读这四个字节作为一个整数什么...看来Python是阅读他们的字符并返回一个字符串,它不能转换为整数。我怎样才能正确地做到这一点?

+2

如果你的目标是*使用*位图,而不是花时间编写自己的BMP库(不是那听起来不像有趣...),你可以使用PIL http://www.pythonware.com/产品/ pil /你可能已经安装了。试试:import图片 – 2009-07-22 07:24:00

+4

感谢Jared,但我想手动阅读bmp以获得乐趣! :) – 2009-07-22 07:33:42

回答

88

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字节顺序写入。

+18

而不是写`i = struct.unpack(...)[0]`我经常写`i,= struct.unpack(...)` – 2009-07-22 10:32:30

+0

@Otto是否有任何理由您更喜欢单向的方式其他?有没有逻辑差异? – Caltor 2012-10-16 22:45:27

+1

我觉得很奇怪,没有内置的函数来从Python中的文件中读取整数(或短裤等)。我不是Java专家,但我相信它具有本机功能,例如readUnsignedShort()来执行此操作。 – Caltor 2012-10-16 22:47:34

4

当你正在阅读的二进制文件,你需要将它解压到一个整数,所以使用结构模块为

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

除了struct你也可以使用array模块

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

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

2

对于Python 3.2+的,你也可以做到这一点使用from_bytes本地INT方法:

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

需要注意的是此功能,需要您指定的电话号码是否是大端或小端格式进行编码,所以你必须确定序列号以确保它能正常工作。

相关问题