这篇文章比较难以成型。大概想表达的意思是,程序员应该通过脚本语言来完成一些“批量”或“自动化”的操作,而不是重复的去做体力劳动。
具体方式因人而异,比如有人非常熟悉bat或者shell的编写,或者有人非常熟悉php、perl的编写,而我更早接触了Python,所以很多工具更加习惯用Python来完成。
这里会先讲一下我的各种需求,以及脚本语言的选择,后面会针对Python逐渐补全很多"惯用法",把自己常用的功能和代码段记录下来。
一、综述
Python作为一个相当完善的脚本语言,几乎可以应对实际工作中的各种需求。当然我不是后端程序员,不会拿它来开发服务器功能。但是做为“瑞士军刀”,即便我只是用了Python很简单的一些功能,它也为我的工作提供了非常多的便利。
1、批量文件重命名,非常简单的六七行代码就可以搞定,而且更加自由,比网上下的工具功能更加强大。例如,你可以查找或者正则匹配,提供更加复杂的替换选项。
2、批量执行某个操作,比如Texture Packer批量打包,批量转换资源,批量dds转png,批量模型转换,批量lua文件加密等等。这个就是通过os.system执行一个系统命令就可以搞定。而python提供更加灵活的功能,比如你可以不使用os.system而使用process,虽然代码会复杂一些,但是可以监听命令的执行情况。你可以在转换文件的同时生成一份对应的配置。你也可以自动创建好对应的目录结构。
3、图片处理。PIL(Python Image Library,需要单独下载,是第三方库,python的第三方库种类繁多,几乎没有不能实现的功能)可以针对图片做一些列操作,非常简单,几行代码就可以搞定,比如把图片扩展成2的整次幂,大图片切分成小图片,图片拉伸或者缩小等等,也可以不依赖Texture Packer而进行图片格式转换。
4、文本操作。Python的正则表达式功能强大,可以非常方便的进行匹配和捕获,从而完成一些文本处理操作。比如给每个头文件最开始插入版权声明。把某个plist中的.png改为.pvr.ccz等等
5、excel操作。这个其实也算文本操作,不过由于需要下载第三方库(xlrd),而且功能也很重要,所以单独提一下。通过python可以读写excel中的内容,生成客户端或者服务器需要的配置格式,比如json、xml、csv等等。更加清晰方便,实在没有必要搞什么vb脚本。
6、自动化功能。这个基本上是批量执行操作的扩展版。使用python可以自动执行一些列操作,免去了手动时候的误操作,提高了工作效率。比如自动比较两个文件夹的差异,拷贝差异文件,生成zip包以及更新配置表。
基本上程序员会更喜欢命令行的方式,而非程序可能更倾向GUI的方式,Python同样支持PyQT来开发GUI程序,也可以使用工具把脚本打包成exe来发布,这样目标机器就不需要依赖python库了。
基于我上面的这些需求,Python(Perl没有学习过,不过我个人还是蛮有好感的)是最满足条件的。其他的一些语言,虽然会有某些优势,不过显然它们有更加擅长的领域。比如:
1、bat和shell,这个都是基于操作系统的批处理,bat功能比较弱,而且不像python那样语法干净,想写对复杂一些的bat语句也不容易。而shell基本上不能在windows下运行,除非装cygwin。
2、php。最早Quick-cocos2dx就是拿php做脚本语言来做一些文本处理的操作。不过php环境很难搭,需要apache、MySQL一大堆东西,很显然它应该乖乖的当服务器后端,而不是“瑞士军刀”
3、Ruby。这个真没有接触过,不过如果没有Ruby On Rails,Ruby也不会发展起来。同样安心的做网站吧。
4、lua。客户端很常用,语法也很熟悉,不过可惜几乎没有第三方库,很多需要用到的东西都要c++实现一遍,然后导出给lua。显然这是无比麻烦的。而且有一个有意思的事情是这样的,之前有人拿lua和c++实现了excel导出成lua的程序,导出时间将近10秒,而我用python重新实现了一下,导出时间不到1秒。可见lua只适合做胶水语言。lua就是一个刀刃,用对地方锋利无比,用错了容易划到自己的手。
5、node.js。这个用来做小工具也是一个选择,但是它的第三方库更多的是给后端用的。而且因为它异步的需求,读写文件的代码会写的很恶心,而我最常用的就是这个功能了。
6、Golang、D语言。 Golang语法很诡异,我看两眼就不打算学了,D语言一直没有发展起来,这两个都是编译级别的,不是脚本语言
7、c、c++、c#、java。这些语言无所不能,但是跟脚本语言比还是略显复杂。这个复杂倒并不体现在语法层面,而是操作成本。比如我写一个python脚本6行代码,瞬间搞定。但是c++要编译、要发布、要注意各种依赖、要关注工程配置等等。
二、惯用法
1、解决UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position
Python最让人头疼的是字符集的处理,由于是脚本语言,所以字符集的问题不光体现在输入输出上面,脚本自身的字符集要指定,运行中出现字符集的问题也会导致异常(而不仅仅是输出文字的错误)
字符集的问题,在文件前加两句话:
reload(sys)
sys.setdefaultencoding( "utf-8" )
2、json输出中文异常
python的json.dumps方法默认会输出成这种格式"\u535a\u5ba2\u56ed",。
要输出中文需要指定ensure_ascii参数为False,如下代码片段
json.dumps({'text':"中文"},ensure_ascii=False,indent=2)
3、字符串连接
', '.join(values))
values是一个string的数组,这句话的意思就是把values中的每个string通过逗号连接起来。一句话就可以搞定,不需要遍历自己拼接以及关注最后一个逗号是否要添加等等。
4、类型判定
直接使用type可以判定一个变量的类型,比如
type('123') == unicode type(123) == int
实际应用中还有一些额外的处理情况,比如浮点型跟整型的判定
type(eval("123")) == int type(eval("123.23")) == float
如果上面的还不满足需求,还有一个取巧一点的方法
int(number) == number #整数
5、文本遍历
fp = open('文件名', 'r') for line in fp: xxxxx
6、筛选文件
fileList = glob.glob(SOURCE_PATH + "/*.xls*");
7、文件遍历
for root, dirs, files in os.walk(SOURCE_PATH): for each in files: file = os.path.join(root, each);
8、获取文件名
filename = os.path.basename(file);
9、执行exe
os.system('命令内容')
执行脚本完毕按任意键退出
os.system('PAUSE');
10、判定文件、文件夹是否存在
os.path.exists(cfgfile)
11、创建文件夹(自动按目录结构创建)
if not os.path.exists(outputPath): os.makedirs(outputPath);
12、获取当前目录
os.getcwd()
未完待续......