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模块
可以取到当前的系统路径,可以用它里面的成员来进行系统文件操作,很方便
大概就用到了这些,里面基本用到的是函数,没有用到类。下面会附些代码片段。
#!usr/bin/python
#FileName: vba_generator.py #辅助方法
def write_to_file(file_out, list):
for str in list:
file_out.write(str) def delete_useless_chart(str):
str = str.strip()
if str == "":
return ""
print ("\tfunc delete_useless_chart: %s \n"%(str))
if (str.find("、") != -1):
list = str.split("、")
return list[1]
else:
return str def init(file_out):
print ("\tinit\n")
list = ["""\tindex_slide = ActivePresentation.Slides.Count
If index_slide < 1 then Exit Sub\n""",
"\tset shapes = ActiveWindow.Selection.SlideRange.Shapes\n"]
write_to_file(file_out, list) def end_case(file_out):
write_to_file(file_out, "End Sub\n") def begin_case(func_name, file_out):
list = ["Sub %s()\n"%(func_name),
"\twindowsIndex = 1\n",
"\tApplication.Windows(windowsIndex).Activate\n",
"\tDim shapes as shapes\n",
"\tDim index_slide as Integer\n"]
write_to_file(file_out, list) def open_action(line, file_out):
print ("\topen_action: %s\n"%(line))
write_to_file(file_out, "\t\'操作: %s\n"%(line)) def close_action(line, file_out):
write_to_file(file_out, "\t\'操作: %s\n"%(line))
write_to_file(file_out, "\tPresentations.Item(windowsIndex).Saved = ksoTrue\n\
\tActivePresentation.Close\n") def change_action(line, file_out):
dict = { "母版视图" : """\tActiveWindow.ViewType = ppViewSlideMaster
index_slide = ActivePresentation.Designs.Count
If index_slide < 1 then Exit Sub
set shapes = ActivePresentation.Designs(1).SlideMaster.Shapes\n"""
} temp_str = line.split("到")[1]
str = dict.get(temp_str, "Todo")
if (str != "Todo"):
write_to_file(file_out, "\t\'操作:%s\n"%(line))
write_to_file(file_out, str)
else:
write_to_file(file_out, "\t\'备注: %s vba实现不了\n"%(line)) def insert_action(line, file_out):
dict = { "矩形" : """\tshapes.AddShape(msoShapeRectangle, 133.25, 94.25, 232.38, 130.38).Select\n""",
"线条" : """\tshapes.AddLine(70.88, 338, 428, 394.75).Select\n""",
"表格" : """\tshapes.AddTable(3, 3).Select\n""",
"图表" : """\tshapes.AddOLEObject(Left:=120, Top:=110, Width:=480, Height:=320, ClassName:="Et.chart.6", Link:=msoFalse).Select
With ActiveWindow.Selection.ShapeRange
.Left = 120
.Top = 109.875
.Width = 480
.Height = 320.25
End With\n""",
"艺术字" : """\tshapes.AddTextEffect msoTextEffect15, \"WPS Office\", \"Arial\", 30, ksoFalse, ksoFalse, 0, 0\n""",
"公式" : """\tActiveWindow.Selection.SlideRange.Shapes.AddOLEObject(Left:=120, Top:=110, Width:=480, Height:=320, ClassName:=\"Equation.KSEE3\", Link:=msoFalse).Select
\t\'上面只能调出公式编辑窗口,以下流程应该用测试工具保障\n""",
"符号" : """\tTodo\n"""}
str = dict.get(line[2:], "Todo")
if (str != "Todo"):
write_to_file(file_out, "\t\'操作:%s\n"%(line))
write_to_file(file_out, str)
else:
write_to_file(file_out, "\t\'备注: %s vba实现不了\n"%(line)) def delete_action(line, file_out):
#print (line[2:])
if (line[2:] == "输入内容"):
write_to_file(file_out, "\t\'操作:%s\n"%(line))
write_to_file(file_out, "\tshapes.Item(1).TextFrame.TextRange.Text = \"\"\n")
elif (line[2:] != "组织结构图"):
write_to_file(file_out, "\t\'操作:%s\n"%(line))
write_to_file(file_out, "\tcount = shapes.count\n\
\tif count > 0 Then shapes(count).Delete\n")
else:
write_to_file(file_out, "\t\'备注: %s vba实现不了\n"%(line)) def input_action(line, file_out):
if (line[2:5] == "占位符" or line[2:4] == "内容"):
list = line.split("“")
str_value = list[1][0:-1]
print (str_value)
write_to_file(file_out, "\t\'操作:%s\n"%(line))
write_to_file(file_out, "\tshapes.Item(1).TextFrame.TextRange.Text = \"%s\"\n"%(str_value)) def main():
import sys
file_name = sys.argv[0]
file_dir = file_name.split("vba_generator.py")[0] file_in = open(file_dir + "\delete.txt")
file_out = open(file_dir + "\delete_case_vba.txt", 'w') case_index = 0
first_step = 1
for str in file_in.readlines():
str = delete_useless_chart(str)
print (str)
if (str.strip() == ""):
continue
if (str[0:4] == "Case"):
if (case_index != 0):
end_case(file_out)
first_step = 1
case_index += 1
begin_case(str[0:4] + "_%d"%(case_index), file_out)
else:
if (first_step == 1 and str[0:2] != "切换"):
init(file_out)
first_step = 0
print (str)
if (str[0:4] == "打开文档"):
open_action(str, file_out)
elif (str[0:4] == "关闭文档"):
close_action(str, file_out)
elif (str[0:2] == "切换"):
change_action(str, file_out)
elif (str[0:2] == "插入"):
insert_action(str, file_out)
elif (str[0:2] == "删除"):
delete_action(str, file_out)
elif (str[0:2] == "输入"):
input_action(str, file_out)
else:
print ("\tmain function: to %s\n"%(str)) end_case(file_out)
case_index += 1
file_in.close()
file_out.write("Sub main()\n")
for i in range(1, case_index):
file_out.write("\tCase_%d\n"%(i))
end_case(file_out) file_out.close()
if (__name__ == "__main__"):
main()
python使用总结的更多相关文章
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
- JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议
软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...
- 可爱的豆子——使用Beans思想让Python代码更易维护
title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...
- 使用Python保存屏幕截图(不使用PIL)
起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...
- Python编码记录
字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...
- Apache执行Python脚本
由于经常需要到服务器上执行些命令,有些命令懒得敲,就准备写点脚本直接浏览器调用就好了,比如这样: 因为线上有现成的Apache,就直接放它里面了,当然访问安全要设置,我似乎别的随笔里写了安全问题,这里 ...
- python开发编译器
引言 最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便.乘着余热未过,头脑清醒,记下一点总结和心得,方便各位pythoner参考使用. ...
- 关于解决python线上问题的几种有效技术
工作后好久没上博客园了,虽然不是很忙,但也没学生时代闲了.今天上博客园,发现好多的文章都是年终总结,想想是不是自己也应该总结下,不过现在还没想好,等想好了再写吧.今天写写自己在工作后用到的技术干货,争 ...
随机推荐
- 【svn】SSL error: A TLS warning alert has been received的解决方法
第一次用svn(>_<),结果在运行下面语句时,svn很不友好的报错了..... svn co http:10.11.12.13/test1/test2 . 报错信息: svn: OPTI ...
- Hexo博客建设
上次我教大家利用wordpress程序搭建个人网站,这次换个Hexo来搭建咱们的个人博客,那咱们开始吧!先提供官网给大家英文版的请点击这里,中文版的请点击这里,好了然后是工具要准备下,貌似就只要安装g ...
- Linux更改计算机名称
1.修改:vim /etc/hosts 2.修改:vim /etc/sysconfig/network 3.重启:reboot 如不重启可以输入:hostname 新改的计算机名称,然后su
- hosts文件权限导致监听无法启动
1.所属系统:2.问题描述:3.解决4.参考???疑点:为什么修改主机名会使hosts文件权限发生改变 1.所属系统: ZHJS2#[/]uname -a HP-UX ZHJS2 B.11.31 U ...
- [BI项目记]-新任务处理
上一篇主要介绍如何借助TFS创建一个新的工作项,此篇主要演示如何对其进行处理. 首先回顾下新工作项不同阶段的定义. 接下来进入到开发阶段,根据需求创建五个报表.打开SQL Server Data To ...
- 多个supplemental logging的说明与删除
有时候我们做ogg的时候,查看info trandata schema.table 无法查看到对应的supplement log信息, 但是我们查看table script的时候可以看到supplem ...
- Swift String类型常规操作
去除string 首尾的空格var str = " Hello the world "let whitespace = NSCharacterSet.whitespaceAnd ...
- SQL Server 2012 新特性
--Concat示例 ,null,'RTM') --Format实例 DECLARE @d DATETIME = GETDATE(); SELECT FORMAT( @d, 'd', 'en-US' ...
- AndroidAnnotations(Code Diet)android快速开发框架
最近用了一款很不错的android快速开发框架,1000行的代码瞬间变成几百行,不用你会后悔的 特点: (1) 依赖注入:包括view,extras,系统服务,资源等等(2) 简单的线程模型,通过an ...
- jquery 回车事件
简单地记下jquery实现回车事件,代码如下: 全局: $(document).keydown(function(e){ if(e.keyCode==13){ $(".login-li in ...