Python中的struct模块介绍

   这篇文章主要介绍了Python中的struct模块,代码基于Python2.x版本,需要的朋友可以参考下

  准确地讲,Python没有专门处理字节的数据类型。但由于str既是字符串,又可以表示字节,所以,字节数组=str。而在C语言中,我们可以很方便地用struct、union来处理字节,以及字节和int,float的转换。

  在Python中,比方说要把一个32位无符号整数变成字节,也就是4个长度的str,你得配合位运算符这么写:

  ?

1
2
3
4
5
6
7
8

>>> n = 10240099
>>> b1 = chr((n & 0xff000000) >> 24)
>>> b2 = chr((n & 0xff0000) >> 16)
>>> b3 = chr((n & 0xff00) >> 8)
>>> b4 = chr(n & 0xff)
>>> s = b1 + b2 + b3 + b4
>>> s
'x00x9c@c'

  非常麻烦。如果换成浮点数就无能为力了。

  好在Python提供了一个struct模块来解决str和其他二进制数据类型的转换。

  struct的pack函数把任意数据类型变成字符串:

  ?

1
2
3

>>> import struct
>>> struct.pack('>I', 10240099)
'x00x9c@c'

  pack的第一个参数是处理指令,'>I'的意思是:

  >表示字节顺序是big-endian,也就是网络序,I表示4字节无符号整数。

  后面的参数个数要和处理指令一致。

  unpack把str变成相应的数据类型:

  ?

1
2

>>> struct.unpack('>IH', 'xf0xf0xf0xf0x80x80')
(4042322160, 32896)

  根据>IH的说明,后面的str依次变为I:4字节无符号整数和H:2字节无符号整数。

  所以,尽管Python不适合编写底层操作字节流的代码,但在对性能要求不高的地方,利用struct就方便多了。

  struct模块定义的数据类型可以参考Python官方文档:

  https://docs.python.org/2/library/struct.html#format-characters

  Windows的位图文件(.bmp)是一种非常简单的文件格式,我们来用struct分析一下。

  首先找一个bmp文件,没有的话用“画图”画一个。

  读入前30个字节来分析:

  ?

1

>>> s = 'x42x4dx38x8cx0ax00x00x00x00x00x36x00x00x00x28x00x00x00x80x02x00x00x68x01x00x00x01
x00x18x00'

  BMP格式采用小端方式存储数据,文件头的结构按顺序如下:

  两个字节:'BM'表示Windows位图,'BA'表示OS/2位图;

  一个4字节整数:表示位图大小;

  一个4字节整数:保留位,始终为0;

  一个4字节整数:实际图像的偏移量;

  一个4字节整数:Header的字节数;

  一个4字节整数:图像宽度;

  一个4字节整数:图像高度;

  一个2字节整数:始终为1;

  一个2字节整数:颜色数。

  所以,组合起来用unpack读取:

  ?

1
2

>>> struct.unpack('<ccIIIIIIHH', s)
('B', 'M', 691256, 0, 54, 40, 640, 360, 1, 24)

  结果显示,'B'、'M'说明是Windows位图,位图大小为640x360,颜色数为24。

  请编写一个bmpinfo.py,可以检查任意文件是否是位图文件,如果是,打印出图片大小和颜色数。

时间: 2024-09-17 03:38:12

Python中的struct模块介绍的相关文章

Python中由于logging模块误用导致的内存泄露的解决方法

  Python中由于logging模块误用导致的内存泄露的解决方法         这篇文章主要介绍了解决Python中由于logging模块误用导致的内存泄露,针对由于过多的UDP连接所产生的问题,需要的朋友可以参考下 首先介绍下怎么发现的吧, 线上的项目日志是通过 logging 模块打到 syslog 里, 跑了一段时间后发现 syslog 的 UDP 连接超过了 8W, 没错是 8 W. 主要是 logging 模块用的不对 我们之前有这么一个需求, 就是针对每一个连接日志输出当前连接

在Python中使用zlib模块进行数据压缩的教程

  这篇文章主要介绍了在Python中使用zlib模块进行数据压缩的教程,是Python入门学习中的基础知识,需要的朋友可以参考下 Python标准模块中,有多个模块用于数据的压缩与解压缩,如zipfile,gzip, bz2等等.上次介绍了zipfile模块,今天就来讲讲zlib模块. zlib.compress(string[, level]) zlib.decompress(string[, wbits[, bufsize]]) zlib.compress用于压缩流数据.参数string指

Python中的zipfile模块使用详解

  这篇文章主要介绍了Python中的zipfile模块使用详解,zipfile模块是用来操作zip文件,需要的朋友可以参考下 zip文件格式是通用的文档压缩标准,在ziplib模块中,使用ZipFile类来操作zip文件,下面具体介绍一下: class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]]) 创建一个ZipFile对象,表示一个zip文件.参数file表示文件的路径或类文件对象(file-like object);参

Python中的日志模块logging

  这篇文章主要介绍了Python中的日志模块logging,包括Python下的日志级别以及模块内常用方法的使用,需要的朋友可以参考下 许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net,c++中,有人们熟悉的log4cpp,而在python中,我们不需要第三方的日志组件,因为它已经为我们提供了简单易用.且功能强大的日志模块:logging.logging模块支持将日志信息保存到不

在Python中使用glob模块查找文件路径的方法

  这篇文章主要介绍了在Python中使用glob模块查找文件路径的方法,使用模块其中的iglob方法实现起来非常简单,需要的朋友可以参考下 glob模块是最简单的模块之一,内容非常少.用它可以查找符合特定规则的文件路径名.跟使用windows下的文件搜索差不多.查找文件只用到三个匹配符:"*", "?", "[]"."*"匹配0个或多个字符;"?"匹配单个字符;"[]"匹配指定范围内的

给Python中的MySQLdb模块添加超时功能的教程

  这篇文章主要介绍了给Python中的MySQLdb模块添加超时功能的教程,timeout功能在服务器的运维当中非常有用,需要的朋友可以参考下 使用Python操作MySQL数据库的时候常使用MySQLdb这个模块. 今天在开发的过程发现MySQLdb.connect有些参数没法设置.通过这个页面我们可以看到在connect的时候,可以设置的option和client_flags和MySQL c api相比差不少. 一个很重要的参数 MYSQL_OPT_READ_TIMEOUT没法设置,这个参

在Python中使用mechanize模块模拟浏览器功能

  这篇文章主要介绍了在Python中使用mechanize模块模拟浏览器功能,包括使用cookie和设置代理等功能的实现,需要的朋友可以参考下 知道如何快速在命令行或者python脚本中实例化一个浏览器通常是非常有用的. 每次我需要做任何关于web的自动任务时,我都使用这段python代码去模拟一个浏览器. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import mechanize import cookielib # Br

在Python中使用PIL模块对图片进行高斯模糊处理的教程

  这篇文章主要介绍了在Python中使用PIL模块对图片进行高斯模糊处理的教程,这个无图形界面的脚本代码非常简单,需要的朋友可以参考下 从一篇文章中看到,PIL 1.1.5 已经内置了高斯模糊,但是并没有在文档中提及,而且PIL的高斯模糊中 radius 是硬编码, 虽然构造方法中有传入 radius 参数,但压根就没有用到 (看这里),所以需要自己进行改造,当然,知道了原因, 修改起来自然非常简单了. 结合帖子中的需求,对局部进行高斯模糊,所以还需要结合使用 crop 和 paste 方法实

Python中的ConfigParser模块使用详解

  这篇文章主要介绍了Python中的ConfigParser模块的使用,ConfigParser模块主要被用来读写配置模块,需要的朋友可以参考下 1.基本的读取配置文件 -read(filename) 直接读取ini文件内容 -sections() 得到所有的section,并以列表的形式返回 -options(section) 得到该section的所有option -items(section) 得到该section的所有键值对 -get(section,option) 得到section