python中提取位图信息(AttributeError: module 'struct' has no attribute 'unstack')
前言
今天这篇博文有点意思,它是从一个例子出发,从而体现出在编程中的种种细节和一些知识点的运用。和从前一样,我是人,离成神还有几十万里,所以无可避免的出现不严谨的地方甚至错误,请酌情阅读。
0x00
首先,题目是:读取一个位图文件(xxx.bmp),然后读取前30个字节,从这前三十个字节中提取一些信息。
这里有一些知识要先知道:一个位图的前30位有什么?
BMP格式采用小端方式存储数据,文件头的结构按顺序如下:
- 前两个字节:'BM'表示Windows位图,'BA'表示OS/2位图;
- 一个4字节整数:表示位图大小;
- 一个4字节整数:保留位,始终为0;
- 一个4字节整数:实际图像的偏移量;
- 一个4字节整数:Header的字节数;
- 一个4字节整数:图像宽度;
- 一个4字节整数:图像高度;
- 一个2字节整数:始终为1;
- 一个2字节整数:颜色数。
你先要知道,读取一个位图的前30位,那么这前30位是什么编码呢?例如,某个位图的前30位:
b'\x42\x4d\x38\x8c\x0a\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00\x80\x02\x00\x00\x68\x01\x00\x00\x01\x00\x18\x00'
很容易看出,它们的单位是bytes
,也就是说,我们无法直接看懂它们,因此,我们得把它转换成我们能看懂的东西。
**python有趣的地方就在这里了,Python提供了一个struct
模块来解决bytes
和数据类型的转换。 **
例如,我想把一个整数10241024
转换为以bytes
为单位的字节怎么办?(如果你不懂字节编码,看这里)很简单:
>>> struct.pack('>I', 10241024)
b'\x00\x9cD\x00'
稍微解释一下:
>
表示字节顺序是big-endian,也就是网络序,I
表示4字节无符号整数。
那么我想把以bytes
为单位的字节转换回整型怎么办?,也很简单:
>>> struct.unpack('>I', b'\x00\x9cD\x00')
(10241024,)
要注意的地方就是unpack
函数的第一个参数:'>I'
,解释和pack
函数的一样。
0x01
到了这里,基本可以看例子了。说明:
- 我的执行环境是:python 3.6;
data.bmp
是我用Windows自带画图随手画的一个位图图片;- 我把这个程序保存为:
struct1.py
; data.bmp
和struct1.py
同在一个Windows目录下,完整路径:G:\newpython\data.bmp
和G:\newpython\struct1.py
例子:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import struct
from collections import namedtuple
def bmg_info(weitu):
with open(weitu, 'rb') as f:
data = f.read(30)
info = BMGinfo(*struct.unpack('<ccIIIIIIHH', data))
if info.ch1 == b'B' and (info.ch2 == b'M' or info.ch2 == b'A'):
return {
'width': info.width,
'height': info.height,
'color': info.colornum
}
return None
if __name__ == "__main__":
BMGinfo = namedtuple('BMGinfo', ('ch1','ch2','size','reserved','offset','headerbits','width','height','num','colornum'))
weitu = sys.argv[1]
print(bmg_info(weitu))
打开cmd
,进入目录G:\newpython
,执行命令:python struct1.py "G:\newpython\data.bmp"
即可看见惊喜。
这篇博客说到这里,终于到了重要的地方。其实在实践这段代码时,我遇见了几个问题(错误):
- 遇到错误(AttributeError: module 'struct' has no attribute 'unpack'),原来是我自己的py文件不要和系统的模块名重名,解决办法,把文件名改掉(我这里把
struct.py
改为struct1.py
); - 灵活运用namedtuple。了解更多请看这里
- 灵活运用可变参数技能(*struct.unpack('<ccIIIIIIHH', data)),关于可变参数,看这里
0x10
感谢阅读。
python中提取位图信息(AttributeError: module 'struct' has no attribute 'unstack')的更多相关文章
- Windows解决多版本python执行pip3时出错AttributeError: module 'enum' has no attribute 'IntFlag'?
摘要: 本机装有python2.7和python3.6,执行pip和pip2时没有问题,执行pip3时提示: C:\Users\>pip3 Traceback (most recent call ...
- 【Python 脚本报错】AttributeError: 'module 'yyy' has no attribute 'xxx'的解决方法
先参考这篇记录大概理解了原因, 再深入了解下python的import机制, 发现自己的模块之间存在互相import. 比如,A.py中import B,而B.py中也import A了, 现在执行模 ...
- python中引入包的时候报错AttributeError: module 'sys' has no attribute 'setdefaultencoding'解决方法?
python中引入包的时候报错:import unittestimport smtplibimport timeimport osimport sysimp.reload(sys)sys.setdef ...
- Python AttributeError: 'Module' object has no attribute 'STARTF_USESHOWINDOW'
夫学须志也,才须学也,非学无以广才,非志无以成学.--诸葛亮 生活有度,自得慈铭 --杜锦阳 今天新来的同事安装环境遇到个莫名其妙的问题: AttributeError: 'Module' objec ...
- Python脚本报错AttributeError: ‘module’ object has no attribute’xxx’解决方法
最近在编写Python脚本过程中遇到一个问题比较奇怪:Python脚本完全正常没问题,但执行总报错"AttributeError: 'module' object has no attrib ...
- python 脚本运行时报错: AttributeError: 'module' object has no attribute ***
最近在编写Python脚本过程中遇到一个问题比较奇怪:Python脚本完全正常没问题,但执行总报错"AttributeError: 'module' object has no attrib ...
- python文件名不要跟模块名相同,报错AttributeError: 'module' object has no attribute 'Differ'
python中的文件都会生成pyc文件,包括模块也是这样,所以调用模块的时候,实际上会调用模块.pyc文件:在这个前提下,如果将文件名命名成跟模块名一样,在同一目录下就会生成一个跟模块名一样的pyc文 ...
- AttributeError: module 'matplotlib' has no attribute 'verbose' (pycharm中使用matplotlib 2.2.0的坑)
AttributeError: module 'matplotlib' has no attribute 'verbose' 环境信息 本地系统:win10 本地开发环境:python(3.6.3), ...
- 一文教你读懂Python中的异常信息
正文共:11813 字 2 图 预计阅读时间: 30 分钟 原文:https://realpython.com/python-traceback/ 译者:陈祥安 原文有所改动. 在写 Python 代 ...
随机推荐
- TOMCAT中文信息乱码改为GBK
# Licensed to the Apache Software Foundation (ASF) under one or more# contributor license agreements ...
- SQL表名,应该用表对应资源对象的复数形式还是单数形式
原文:http://blog.csdn.net/lizeyang 问题 SQL表名,应该用表对应资源对象的复数形式还是单数形式.例如一个用户表,表名是用user还是users更合适呢? 精华回答 ...
- CSS-自适应网页使用@media和rem
@media 查询 @media 媒体查询选择性加载css,意思是自动探测屏幕宽度,然后加载相应的CSS文件.可以针对不同的屏幕尺寸设置不同的样式,特别是需要设置设计响应式的页面,@media 是个不 ...
- angular9 学习笔记
前言: AngularJS作为Angular的最早版本,2010年发布其初始版本,至今已经10年了.除了这个最初版本(没学过),项目上一直从2.x 到至今项目使用8.x版本,现在Angular在201 ...
- “systemd”命令管理各类服务
一.centos7.red hat7 取消了运行级别的概念,用systemd代替了init中的运行级别概念. 二.用"ln"命令把"多用户,无图形"目标文件链接 ...
- python学习HTML之CSS(2)
1.边框的属性设置 PS:边框的高度和宽度可以采用百分比,但是高度方向的百分比基本无用,因为基数没定,参考没意义!! 2.内边距和外边距 3.在右下角添加一个“回顶部”的标签. <div> ...
- Java后台技术(TDDL)
从PC客户端开发转项目经理已经有一段时间了,感觉还不错,平安这边的项目经理还需要对外,所以部门其他项目经理经常需要出差去见客户,我专门对内,部门所有的开发和测试每天做什么.接下来做什么我都必须了解,部 ...
- Bugku-CTF社工篇之密码
- JavaScript - call() , apply() and bind()
参考 https://www.codementor.io/niladrisekhardutta/how-to-call-apply-and-bind-in-javascript-8i1jca6jp h ...
- 2019年springmvc面试高频题(java)
前言 2019即将过去,伴随我们即将迎来的又是新的一年,过完春节,马上又要迎来新的金三银四面试季.那么,作为程序猿的你,是否真的有所准备的呢,亦或是安于本职工作,继续做好手头上的事情. 当然,不论选择 ...