码迷,mamicode.com
首页 > 编程语言 > 详细

程序员的瑞士军刀----Python

时间:2014-11-07 14:53:18      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   ar   os   使用   java   sp   

        这篇文章比较难以成型。大概想表达的意思是,程序员应该通过脚本语言来完成一些“批量”或“自动化”的操作,而不是重复的去做体力劳动。

        具体方式因人而异,比如有人非常熟悉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()

未完待续......




 

程序员的瑞士军刀----Python

标签:style   blog   io   color   ar   os   使用   java   sp   

原文地址:http://blog.csdn.net/langresser_king/article/details/40585067

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!