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线上问题的几种有效技术
工作后好久没上博客园了,虽然不是很忙,但也没学生时代闲了.今天上博客园,发现好多的文章都是年终总结,想想是不是自己也应该总结下,不过现在还没想好,等想好了再写吧.今天写写自己在工作后用到的技术干货,争 ...
随机推荐
- 设计模式--装饰模式Decorate(结构型)
一.装饰模式 动态地给一个对象添加额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活.有时我们希望给某个对象而不是整个类添加一些功能. 二.UML图 1.Component(概念中提到的对象接口 ...
- android adb 命令详解
ADB (Android Debug Bridge) 是android SDK中的工具,需要先配置环境变量才能使用.起调试桥的作用,可以管理安卓设备.(也叫debug工具) ---------查看设 ...
- Java_太阳系_行星模型_小游戏练习_详细注释
//实现MyFrame--实现绘制窗口,和实现重写 重画窗口线程类 package cn.xiaocangtian.Test; import java.awt.Frame; import java.a ...
- Delphi容器类之---Tlist,TStringlist,THashedStringlist的效率比较
转载自:http://www.ylzx8.cn/windows/delphi/73200.html 本人在做一个测试,服务器是IOCP的,我假定最大链接数是50000个. 测试背景:如果每个链接之间的 ...
- Javascript中数组的基本操作
删除数组指定的某个元素 via首先可以给JS的数组对象定义一个函数,用于查找指定的元素在数组中的位置,即索引,代码为: Array.prototype.indexOf = function(val) ...
- Android 笔记 AutoCompleteTextView day8
用于自动补全内容 适应器可用于显示多行内容 package com.supermario.autocompletedemo; import android.app.Activity; import a ...
- [leetcode] 提醒整理之进制
12. Integer to Roman Given an integer, convert it to a roman numeral. Input is guaranteed to be with ...
- 六个漂亮的 ES6 技巧
六个漂亮的 ES6 技巧 转载 原文:2ality 译文:众成翻译 链接:http://www.zcfy.cc/article/346 在这篇文章里,我将演示 6 种 ES6 新特性的使用技巧.在每个 ...
- Puppet自动化部署-前期环境准备(2)
在安装Puppet环境之前需要配置好机器的基本配置,如规范网络地址IP.hostname,certname认证名称,ntp时间同步等配置完毕,完善的搭建自动化环境. 1.环境介绍 此处实现部署的环境是 ...
- Z-STACK在CC2530上同时使用两个串口
定义: 1.同时使用两个串口必须要一个为DMA,一个为ISR 2.我们这里使用串口1(DMA)来和别的设备进行通讯,使用 2(ISR)来和Z-TOOL进行通讯,方便调试 HAL_UART=TRUE Z ...