用case环境或程序自动生成工具来自动生成一部分程序,python case用法
因为最近工作中,需要设计根据wirshark截获的报文自动产生测试情况的小工具,我重温了python。这个笔记,就是根据这个工具的实现,来记录大蟒语法的学习过程。
这个工具的功能如下图所示,其中wirshark帽可以通过wirshark自身的功能导出为海平面气压场格式,也就是一种XML,同时公司使用的案例脚本也是一种XML,只是添加了一些循环,判断等功能。
所以这个工具涉及文件操作,XML解析和一些大蟒的基本语法功能
一、PYTHON基本语法概念
1.什么是主要的函数
if __name__==__main__ :
上面这个就是大蟒的主要的函数的声明
2.变量申明
大蟒对变量申明不像那么严格,但也不像壳那么随便。一般变量通过首次赋值产生,当超出作用范围时自动消亡。这几句话的意思是,变量如果要使用就一定要先给他赋值。比如
打印str1
一定会报错
大家称呼这个味字典型,其实可以类比为C语言中的结构体。因为大蟒里面是没有结构体这类东西的,当然大蟒可以用班级的方法替代结构。但词典这个类型也可以在某些时候当做结构体这个概念来用
d={server:mpilgrim , database:master}
这个类型是可以作为不同类型数据的容器的,但要注意一个问题词典在插入的时候是乱序的,也就是说当我做
d[newdata]=fda
这个操作后,这个新加入的项会随机加在d中,不一定在最后。
4.计算机编程语言的层次结构
大蟒依靠代码缩进和:来确定代码的前后层次关系
如下面这个函数,缩进起到了C语言中{}的作用。
def GetEnumName(attrib name,valuestr):
@作者:利米姆
@ param属性名:属性名
@ type属性名:str
@param valuestr:mmt日志值
@type valuestr:str
@返回:枚举名称
@rtype:str
tree=ReadFromXml( pegasusenummapping。XML’)
root=tree.getroot()
value=str(int(valuestr,16))
errorret=
对于root.iter(attrib )中的列表节点:
strlist=列表节点。属性[名称].拆分(.)
属性列表=属性名称。拆分( . )
substrlist=strlist[(len(strlist)-4):]
subattributelist=attriblist[(len(attriblist)-4):]
如果子列表==子属性列表:
对于链表结点中的enumlistnode:
if enumlistnode[0].文本==值:
返回enumlistnode[1].文本
否则:
errorret=enumlistnode[1].文本
打印"错误"
打印属性名
打印manualmuscletest肌力试验日志值 值字符串
打印设置默认值 错误返回
打印 ############
返回错误浸水使柔软
二、元素树
这个工具处理的主要文件格式是XML,就用元素树这个库来处理,下面是要处理文件格式的一部分。
?可扩展标记语言版本=1.0 ?
产品数据表示语言版本=0 创建者=wireshark/1.20.0.1
小包
proto name= gen info pos= 0 showname=一般信息size=98
field name= num pos= 0 show= 1246 showname= Number value= 4de size= 98 /
field name= len pos= 0 show= 98 showname=帧长度value=62 size=98/
field name= caplen pos= 0 show= 98 showname= Captured Length value= 62 size= 98 /
字段名=时间戳位置= 0 显示= 2013年3月6日18:28:28.729395000中国标准时间showname=捕获时间value= 1362565708.729395000 size= 98 /
/proto
proto name= Frame showname= Frame 1246:线上98个字节(784位),捕获98个字节(784位) size=98 pos=0
字段名=帧。时间 showname=到达时间:2013年3月6日18:28:28.729395000中国标准时间size= 0 pos= 0 show= 2013年3月6日18:28:28.729395000/
字段名=帧。纪元时间:136256 . 38636666666秒size= 0 pos= 0 show= 1362565008 /
字段名=帧。Time _ delta showname=与先前捕获的帧的时间差值:0.000475000秒size= 0 pos= 0 show= 0.000475000 /
字段名=帧。Time _ delta _ displayed showname=与前一显示帧的时间差值:0.000000000秒size= 0 pos= 0 show= 0.00000000 /
字段名=帧。Time _ relative showname=从参考或第一帧开始的时间:93.072253000秒size= 0 pos= 0 show= 93.072253000 /
字段名=帧。Number showname= Frame Number:1246 size= 0 pos= 0 show= 1246 /
field name=frame.len showname=帧长度:98字节(784位) size=0 pos=0 show=98/
字段名=帧。cap _ len showname=捕获长度:98字节(784位) size=0 pos=0 show=98/
字段名=帧。标记为“showname=”的框架被标记为:False size=0 pos=0 show=0/
字段名=帧。忽略了“showname=”帧被忽略:False size=0 pos=0 show=0/
字段名=帧。Protocols showname= Protocols in frame:eth:IP:UDP:mm TSS:sicap size= 0 pos= 0 show= eth:IP:UDP:mm TSS:sicap /
字段名=帧。着色_规则。Name showname=着色规则名称:SICAP size= 0 pos= 0 show= SICAP /
字段名=帧。着色_规则。String showname=着色规则String:sicap size= 0 pos= 0 show= sicap /
/proto
以太网II,Src:192。168 .254 .1(00:0f:bb:69:93:ee),Dst:DCT-INF(00:10:18:CB:b5:FD) size= 14 pos= 0
字段名=eth。 dst showname= Destination:DCT-INF(00:10:18:CB:b5:FD) size= 6 pos= 0 show= 00:10:18:CB:b5:FD value= 001018 cbb 5 FD
字段名=eth。addr showname= Address:DCT-INF(00:10:18:CB:b5:FD) size= 6 pos= 0 show= 00:10:18:CB:b5:FD value= 001018 cbb 5 FD /
字段名称=eth.ig 显示名称=.0 ..=IG位:单个地址(单播) size= 3 pos= 0 show= 0 value= 0 unmasked value= 001018 /
字段名称=eth.lg 显示名称=.0...=LG位:全局唯一地址(出厂默认) size= 3 pos= 0 show= 0 value= 0 unmasked value= 001018 /
/字段
字段名=eth。资料来源:192。168 .254 .1(00:0f:bb:69:93:ee) size= 6 pos= 6 show= 00:0f:bb:69:93:ee value= 000 fbb 6993 ee
字段名=eth。addr showname=地址:192。168 .254 .1(00:0f:bb:69:93:ee) size= 6 pos= 6 show= 00:0f:bb:69:93:ee value= 000 fbb 6993 ee /
字段名称=eth.ig 显示名称=.0 ..=IG位:单个地址(单播) size= 3 pos= 6 show= 0 value= 0 unmasked value= 000 fbb /
字段名称=eth.lg 显示名称=.0...=LG位:全局唯一地址(出厂默认) size= 3 pos= 6 show= 0 value= 0 unmasked value= 000 fbb /
/字段
字段名=eth。Type showname= Type:IP(0x 0800) size= 2 pos= 12 show=0x 0800 value= 0800 /
/proto
1.文件读取
在调试模式下,可以看到树就是根据读入的可扩展置标语言文件用不同层级的结节构成的结构体。这个时候操作就很方便了,我们可以先拿到根,在遍历整个树就可以方便的读取可扩展置标语言中任意一个节点的属性、文本、标签这些内容。
def ReadPacketContent(tree,framenum):
阅读数据包内容
节点:xml节点
数量:节点的索引
SicCapMessage=[]
根=树。getroot()#检查边界
num=0
标志=0
对于根中的节点:#原型级别节点
如果flag==1:
破裂
数字=数字一
#print protonode.tag,protonode.attrib
对于节点中的质子:
如果质子颂歌。attrib[ name ]= frame :
frameList=parseFrameHead(质子节点)
if frameList[1]!=str(framenum):
破裂
否则:
SicCapMessage.insert(0,框架列表)
打印"查找框架,编号为"的框架列表[1]
标志=1
打印编号
打印镜头(根)
如果数量==0或num len(根)- 1:
打印"找不到框架编号"
返回SicCapMessage
对于根[编号- 1]中的质子泵:
如果质子颂歌。attrib[ name ]= sicap :
#dictPrint(parseSiCapMessage(质子节点))
siccapmessage。extend(parseSiCapMessage(质子节点))
返回SicCapMessage
可以看到
质子电极
就是一个词典类型的变量
2.文件写入
读取的问题解决了,剩下的就是写入了。只用调用
tree.write(test.xml , UTF-8 )
就可以将内存中的树写入文件
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。