自从最近这次换工作以后,空闲时间一下子变得奢侈起来,博客最近也写得少了,一些喜欢的小东西也无暇顾及。
——————无聊分割线————————-
一直对python很钟情,不过最近很少用,能记得比较完整的程序就是“用Python做了个Spider”,当时在一个Linode的VPS上跑了几个月。最近处理数据时候又重新用python来做,做完之后还是继续感慨它的便利性。
用python的一个最大的优点就是可以快速的迭代式开发,不断的重构,这一点在这次体会尤深。
其中有几次跳跃式的重构如下:
第一次的重构在书写了几个数据段的解析函数之后,决定定制一个规则,然后通过解析规则来处理各种字段。于是有了一个大约20条记录的标签库(后来再加一个文件解析的时候又增加了6行),然后就处理了近30种数据段,而且可以很方便的定制扩充。
第二次重构在输出报告的完成了一个数据段的汇总后,抽象出了一个Report类,完全控制报告的输出。也就有了后来用css+html的报告时候的顺理成章。
另外一次不大的重构,在于利用的简化的有限状态自动机的思想来处理各种特殊情况。当然只是思想而不是一个完整的自动机。 这一条在N年前给sudidi同学的abaqus数据文件提取工具中就大体考虑过,可以说轻车熟路。
后来用配置文件来设置参数,打包exe。从开始学习到成功,大约花了30分钟,代码10行,我爱python。
除去一些修饰性的代码和css样式表,核心代码不到500行。如果用c++的话,代码量至少要翻2倍,时间2倍不止。
Eclipse+PyDev是目前开发python程序的不二选择,除去log外,一个完善的Debug环境还是很赞的。
——————无聊分割线2——————–
有些东西记下来权当笔记,免得以后再找。
1. 文件路径的相关处理
用 os.path 就完全解决所有问题,包括路径拼接、路径拆分、相对路径提取、文件存在性判断、文件遍历、递归遍历等等。相关函数有:
os.path.join
os.path.basename
os.path.exists
os.makedirs
os.path.isdir
os.path.splitext
2. 文件的遍历
目录下的文件遍历有两种,一种是os.listdir,一种是用os.walk。如果需要递归,则后者更为方便。
1: files = os.listdir(proj_dir)
2: for f in files:
3: filepath = os.path.join(proj_dir,f)
4: if os.path.isdir(filepath): continue
5: if f.find('----')>-1:
6: shutil.copy(filepath, self.REPORT_DETAIL_DIR)
使用os.walk则很容易进行遍历:
1: for root,dirs,files in os.walk(proj_list_dir, True):
2: for f in files:
3: pass
3. 文件的复制
对于文件、文件夹、目录树的拷贝删除可以使用shutil相关函数,注意有些条件,比如目标目录不能存在之类。
shutil.copytree
shutil.rmtree
shutil.copy
4. 乱码
如果能用utf-8统一处理是最好,但是如果在window下面,并且和平常文件打交道多的话,可能也需要其他编码。这时候需要注意系统的编码格式。下面这段代码有帮助。
1: default_encoding = 'gbk'
2: if sys.getdefaultencoding() != default_encoding:
3: reload(sys)
4: sys.setdefaultencoding(default_encoding)
5. 配置文件的读写
python内置了ConfigParser,一般的用途足够了。简洁好用。
6. 打包成exe
有时候为了部署方便,而且windows上默认也不会装python,所以打包成一个独立的exe还是相当有吸引力。以前的py2exe已经不维护了,不过现在有更简单的 pyinstaller (www.pyinstaller.org),使用相当简单,支持各种python版本。
需要留意的是,vc9的crt和upx有冲突,可以取消upx选项。
—————-最后的分割线——————————-
写点喜欢的东西还是很高兴,能提高工作效率,从最枯燥无聊的数据工作中解脱出来更高兴.
人生苦短,有限的时间应该花在有意义的吃喝玩乐上,呵呵.