python使用总结
近来公司的测试部门要我们开发,按他们给我测试案例,写vba脚本,方便他们做自动化测试,老大把这事交给了我做。之前没写过vba,很多API都不会用,边写边谷歌,写得很慢。
我记得测试第一次做的是打开关闭文档的案例,总共15个案例,我之前纯在vba环境里写,大概用了我四个多小时,整个的案例的过程都是:
sub case__xx()
......
end sub
每个案例的代码都不多,大概是十行左右,外边案例流程的注释, 总共也就150行代码,共花四个小时。周末加个班,也就写完了。交差!
过不了几天,测试又拿了个另一个功能的测试案例过来,要我写vba脚本,我看了一下表格,愣了,200个案例?!而且明天就要,给他们。虽然我的数学是语文老师教的,但大概的数我还是会算的,按每个案例5行代码,最小值估计,我也要写1000多行代码,还要明天交?给一天8个小时算,按我上次的进度,是交不了差的。
每一个案例老老实实写是行不能滴,我扫了一下那些案例,发现它们有一个共同点,做的事情很有规律。只此我想到了做一个vba脚本生成器来做这些事情。只为大学时写过半个月python代码,所以我选它来做这个vba脚本生成器,搞了两个半小时,最终真的把那200个案例的代码生成了,而且每个案例的开头和之前的一致,注释、缩进都有,唯一缺点是生成的代码冗余很多。以下是我写到的python的对象及相应模块。
一、文件操作类
(1)python打开一个文件的操作很简单
file = open(“路径”)
相比C++,的引用头文件,指针判空,效率不知提高了几倍。
(2)文件读取操作
line = file.readline() #读取文件里的一行 lines = file.readlines() #读取全部内容
(3)写操作
file.write(string)
(4)关闭文件
file.close()
二、字符串类
(1)切片操作
这个很好用,很多脚本都有这个功能
substr = str[1:4] #取字符串第1到3的子串,下标从0开始
(2)format操作
我之前的字符串拼接总是用
“hello %s\n” %(str)
总觉得不好用,不能把字符串放到一个地方统一管理,最后发现有个format方法
strprint = "hello {0}\n" strprint.format(str)
这个比第一个好用太多了,用多了就知道了
(3)split方法
将字符串按给定的分成一个list,如:
str = "hello world" list = str.split(" ") # list = ["hello", "world"],是不是很方便
三、内置数据结构
pytthon内置有dict,list,tupple,我用得比较多的是list和dict。
list可以理解为一个数组,不过它的功能比数组强大,可以到网上找下介绍
dict是一个键值对的结构,很常用,也很好用。
dict = { "插入" : insertAction, "输入" : inputAction, "删除" : deleteAction }
四、sys模块
Sys模块里面有个argv的成员,是一个数组,可以取到命令行的输入参数,像C语言main函数里的argv。
五、os模块
可以取到当前的系统路径,可以用它里面的成员来进行系统文件操作,很方便
大概就用到了这些,里面基本用到的是函数,没有用到类。下面会附些代码片段。

1 #!usr/bin/python 2 #FileName: vba_generator.py 3 4 #辅助方法 5 def write_to_file(file_out, list): 6 for str in list: 7 file_out.write(str) 8 9 def delete_useless_chart(str): 10 str = str.strip() 11 if str == "": 12 return "" 13 print ("\tfunc delete_useless_chart: %s \n"%(str)) 14 if (str.find("、") != -1): 15 list = str.split("、") 16 return list[1] 17 else: 18 return str 19 20 def init(file_out): 21 print ("\tinit\n") 22 list = ["""\tindex_slide = ActivePresentation.Slides.Count 23 If index_slide < 1 then Exit Sub\n""", 24 "\tset shapes = ActiveWindow.Selection.SlideRange.Shapes\n"] 25 write_to_file(file_out, list) 26 27 def end_case(file_out): 28 write_to_file(file_out, "End Sub\n") 29 30 def begin_case(func_name, file_out): 31 list = ["Sub %s()\n"%(func_name), 32 "\twindowsIndex = 1\n", 33 "\tApplication.Windows(windowsIndex).Activate\n", 34 "\tDim shapes as shapes\n", 35 "\tDim index_slide as Integer\n"] 36 write_to_file(file_out, list) 37 38 def open_action(line, file_out): 39 print ("\topen_action: %s\n"%(line)) 40 write_to_file(file_out, "\t\'操作: %s\n"%(line)) 41 42 def close_action(line, file_out): 43 write_to_file(file_out, "\t\'操作: %s\n"%(line)) 44 write_to_file(file_out, "\tPresentations.Item(windowsIndex).Saved = ksoTrue\n\ 45 \tActivePresentation.Close\n") 46 47 def change_action(line, file_out): 48 dict = { "母版视图" : """\tActiveWindow.ViewType = ppViewSlideMaster 49 index_slide = ActivePresentation.Designs.Count 50 If index_slide < 1 then Exit Sub 51 set shapes = ActivePresentation.Designs(1).SlideMaster.Shapes\n""" 52 } 53 54 temp_str = line.split("到")[1] 55 str = dict.get(temp_str, "Todo") 56 if (str != "Todo"): 57 write_to_file(file_out, "\t\'操作:%s\n"%(line)) 58 write_to_file(file_out, str) 59 else: 60 write_to_file(file_out, "\t\'备注: %s vba实现不了\n"%(line)) 61 62 def insert_action(line, file_out): 63 dict = { "矩形" : """\tshapes.AddShape(msoShapeRectangle, 133.25, 94.25, 232.38, 130.38).Select\n""", 64 "线条" : """\tshapes.AddLine(70.88, 338, 428, 394.75).Select\n""", 65 "表格" : """\tshapes.AddTable(3, 3).Select\n""", 66 "图表" : """\tshapes.AddOLEObject(Left:=120, Top:=110, Width:=480, Height:=320, ClassName:="Et.chart.6", Link:=msoFalse).Select 67 With ActiveWindow.Selection.ShapeRange 68 .Left = 120 69 .Top = 109.875 70 .Width = 480 71 .Height = 320.25 72 End With\n""", 73 "艺术字" : """\tshapes.AddTextEffect msoTextEffect15, \"WPS Office\", \"Arial\", 30, ksoFalse, ksoFalse, 0, 0\n""", 74 "公式" : """\tActiveWindow.Selection.SlideRange.Shapes.AddOLEObject(Left:=120, Top:=110, Width:=480, Height:=320, ClassName:=\"Equation.KSEE3\", Link:=msoFalse).Select 75 \t\'上面只能调出公式编辑窗口,以下流程应该用测试工具保障\n""", 76 "符号" : """\tTodo\n"""} 77 str = dict.get(line[2:], "Todo") 78 if (str != "Todo"): 79 write_to_file(file_out, "\t\'操作:%s\n"%(line)) 80 write_to_file(file_out, str) 81 else: 82 write_to_file(file_out, "\t\'备注: %s vba实现不了\n"%(line)) 83 84 def delete_action(line, file_out): 85 #print (line[2:]) 86 if (line[2:] == "输入内容"): 87 write_to_file(file_out, "\t\'操作:%s\n"%(line)) 88 write_to_file(file_out, "\tshapes.Item(1).TextFrame.TextRange.Text = \"\"\n") 89 elif (line[2:] != "组织结构图"): 90 write_to_file(file_out, "\t\'操作:%s\n"%(line)) 91 write_to_file(file_out, "\tcount = shapes.count\n\ 92 \tif count > 0 Then shapes(count).Delete\n") 93 else: 94 write_to_file(file_out, "\t\'备注: %s vba实现不了\n"%(line)) 95 96 def input_action(line, file_out): 97 if (line[2:5] == "占位符" or line[2:4] == "内容"): 98 list = line.split("“") 99 str_value = list[1][0:-1] 100 print (str_value) 101 write_to_file(file_out, "\t\'操作:%s\n"%(line)) 102 write_to_file(file_out, "\tshapes.Item(1).TextFrame.TextRange.Text = \"%s\"\n"%(str_value)) 103 104 def main(): 105 import sys 106 file_name = sys.argv[0] 107 file_dir = file_name.split("vba_generator.py")[0] 108 109 file_in = open(file_dir + "\delete.txt") 110 file_out = open(file_dir + "\delete_case_vba.txt", 'w') 111 112 case_index = 0 113 first_step = 1 114 for str in file_in.readlines(): 115 str = delete_useless_chart(str) 116 print (str) 117 if (str.strip() == ""): 118 continue 119 if (str[0:4] == "Case"): 120 if (case_index != 0): 121 end_case(file_out) 122 first_step = 1 123 case_index += 1 124 begin_case(str[0:4] + "_%d"%(case_index), file_out) 125 else: 126 if (first_step == 1 and str[0:2] != "切换"): 127 init(file_out) 128 first_step = 0 129 print (str) 130 if (str[0:4] == "打开文档"): 131 open_action(str, file_out) 132 elif (str[0:4] == "关闭文档"): 133 close_action(str, file_out) 134 elif (str[0:2] == "切换"): 135 change_action(str, file_out) 136 elif (str[0:2] == "插入"): 137 insert_action(str, file_out) 138 elif (str[0:2] == "删除"): 139 delete_action(str, file_out) 140 elif (str[0:2] == "输入"): 141 input_action(str, file_out) 142 else: 143 print ("\tmain function: to %s\n"%(str)) 144 145 end_case(file_out) 146 case_index += 1 147 file_in.close() 148 file_out.write("Sub main()\n") 149 for i in range(1, case_index): 150 file_out.write("\tCase_%d\n"%(i)) 151 end_case(file_out) 152 153 file_out.close() 154 if (__name__ == "__main__"): 155 main() 156