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

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

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

未完待续......

时间: 2024-10-09 01:58:24

程序员的瑞士军刀----Python的相关文章

[python]通过微信公众号“Python程序员”,编写python代码

今天发现微信公众号中,居然可以编写python代码,很是惊喜,觉得蛮有趣的. 步骤如下: 1.关注微信公众号“Python程序员” 2.关注成功后,点击右下角的“潘多拉”->"Python终端“->"阅读原文”. 3.Python开发页面被打开,在下面的输入框内,输入python代码,点击确认即可. 可以用来练习python,是不是很有趣呢?

程序员之数据分析Python技术栈

引言: Python是一种非常流行的脚本语言,其还提供了一个科学技术栈,可以进行快捷方便的数据分析,本系列文章将聚焦在如何使用基于Python的技术栈来构建数据分析的工具集合.工欲善其事,必先利其器,让我们来看看这些工具吧. 0. 数据分析 以及机器学习 信息时代唯一不变的就是变化. 随着信息化技术的推广和应用,大数据技术的大规模应用,于是乎数据分析.数据挖掘.机器学习甚至于从前高大上的人工智能(AI)已经开始频繁出现在各个场合,这一切昭示着数据时代的来临. 对于程序猿们来说,除了写代码,实现特

神级程序员巧用python开发王者荣耀把妹神器,一路升级上王者!

Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务.它的语法非常简捷和清晰,与其它大多数程序设计语言不一样,它使用缩进来定义语句. Python支持命令式程序设计.面向对象程序设计.函数式编程.面向切面编程.泛型编程多种编程范式.与Scheme.Ruby.Perl.Tcl等动态语言一样,Python具备垃圾回收

程序员的冷笑话 python版本

在伯乐在线上看到了个冷笑话,感觉很有意思. 1 void tellStory() 2 { 3 printf("从前有座山\n"); 4 printf("山上有座庙\n"); 5 printf("庙里有个老和尚和一个小和尚\n"); 6 printf("有一天\n"); 7 printf("小和尚对老和尚说\n"); 8 printf("\"给我讲个故事吧\"\n");

资深程序员:深入Python进程间通信原理!

输出 3.14159262176 管道pipe 管道是Unix进程间通信最常用的方法之一,它通过在父子进程之间开通读写通道来进行双工交流.我们通过os.read()和os.write()来对文件描述符进行读写操作,使用os.close()关闭描述符. 上图为单进程的管道 上图为父子进程分离后的管道 输出 3.14159262176 无名套接字socketpair 我们知道跨网络通信免不了要通过套接字进行通信,但是本例的多进程是在同一个机器上,用不着跨网络,使用普通套接字进行通信有点浪费. 上图为

程序员带你十天快速入门Python,玩转电脑软件开发(三)

声明:本次教程主要适用于已经习得一门编程语言的程序员.想要学习第二门语言.有梦想,立志做全栈攻城狮的你 . 如果是小白,也可以学习本教程.不过可能有些困难.如有问题在文章下方进行讨论.或者添加QQ群538742639.群马上就满了,名额不多. 这是高级程序员快速入门Python语言课程.助你快速学习Python语言.这是第三课. 程序员带你十天快速入门Python,玩转电脑软件开发(一) 程序员带你十天快速入门Python,玩转电脑软件开发(二) 因技术知识连贯性,还没有学习前两课的同学,建议点

作为python程序员,你需要掌握这些技巧

本文和大家分享的是python开发必备的30 个小技巧,一起来看看吧,希望对大家学习和使用 python 语言有所帮助. 贴士#1. 原地交换两个数字 Python  提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例: x, y = 10, 20print(x, y) x, y = y, xprint(x, y) #1 (10, 20)#2 (20, 10) 赋值的右侧形成了一个新的元组,左侧立即解析(unpack )那个(未被引用的)元组到变量 和 . 一旦赋值完成,新

给Lisp程序员的Python简介

给Lisp程序员的Python简介 作者:Peter Norvig,译者:jineslong<[email protected]> 这是一篇为Lisp程序员写的Python简介(一些Python程序员告诉我,这篇文章对他们学习Lisp也有帮助,尽管这不是我的本意).基本上,Python可以看作一个拥有“传统”语法(Lisp社区称之为“中缀”或者“m-lisp”语法)的Lisp方言.一个来自comp.lang.python的帖子说到“我一直不明白为什么LISP是一个不错的想法,直到我开始玩上了P

Python超级程序员使用的开发工具

我以个人的身份采访了几个顶尖的Python程序员,问了他们以下5个简单的问题: 当前你的主要开发任务是什么? 你在项目中使用的电脑是怎样的? 你使用什么IDE开发? 你将来的计划是什么? 有什么给Python程序员的建议? 就是这几个问题,我找了几个顶尖的程序员和编程书籍作家,问他们这几个相同的问题.下面是他们的回答,希望在他们的回答中你能找到一些可以让你的开发更便捷的工具. Alex Martelli Alex Martelli 人物简介:Alex Martelli是一位意大利计算机软件程序员