计算化学公社
标题: 量化计算中的技巧(三):perl、python [打印本页]
作者Author: sky 时间: 2017-7-15 10:02
标题: 量化计算中的技巧(三):perl、python
本帖最后由 sky 于 2017-7-15 10:03 编辑
在上一篇《量化计算中的技巧(二)》中说到了用shell script完成各式各样的命令,但是这种方法有两个问题:
1. 难以做出复杂的功能
2. 可读性差
3. 代码复用很困难
shell script是可以做很复杂的功能的,它支持正则表达式,支持数组,还有大量好用的系统命令,比如sed和awk。有兴趣的可以去看看《sed与awk》,两个命令写出了400多页的书。当年我就看过某老师写的把MS的输出文件*.cell转换成POSCAR的脚本,里面灵活运用了sed、awk、数组等功能,我是很服气的。
但是这种脚本很难读懂,写起来也很复杂。比如你能看懂这段代码是干什么的吗?
- awk 'BEGIN{i=1} /imag/,\
- /\/imag/ \
- {a=$2 ; b=$3 ; c=$4; d=$5 ; e=$6 ; f=$7; g=$8; i=i+1} \
- END{for (j=12;j<i-3;j++) print a[j],b[j],c[j],d[j],e[j],f[j],g[j]}' vasprun.xml
光是学习sed、awk的时间就够你学几遍python了。而且代码很难复用,比如说你写了个把gjf文件转换成cif文件的脚本,在里面实现了一个读取gjf文件的子功能。但是下次再想要写个把gjf文件转换成POSCAR文件的脚本,之前写过的代码就基本没用了。所以除了学shell script 外,还需要再学一门高级语言:perl或者python.
关于语言的选择,我在第一篇《计算化学编程语言》里说过,在这里不赘述。网上有一套流传广泛的的vasp用的脚本:theory.cm.utexas.edu/vtsttools/scripts.html
这是用perl写的,而且写的非常好。我一开始原本打算直接学python的,看到这套脚本之后没办法只好先学perl,然后学着修改这套脚本,最后再开始写一些想要的功能。
客观来说perl学起来比python要困难,有三方面原因:
1. 动态语义
同样一个表达式,在不同的环境中有不同的意思。学过这么多语言,唯独perl有这个功能,这也是我喜欢perl的一个重要原因。这个功能用好了非常方便,但是对于初学者来说会很困惑。
2. 简写
perl中有很多简写,导致代码无论是写起来还是读起来都很困难,对新手不友好。
3. 没有成熟靠谱的IDE
当年我是在vim里写perl的,vim除了语法高亮之外什么都没有。每写一个函数或者功能都要去查名字和用法对了没。写完之后运行有一大堆报错,只能在命令行下调试。记得当时写一个把震动模式转换成VMD可以播放动画的xyz文件时,花了一天多时间。而python有非常成熟的pycharm可用,对各种内置函数的提示、对语法的检查,还有完善的debug功能。现在我写同样的脚本一个小时足够了。
对于perl和python,因为网上各种教程例子已经很多了,在这里只谈一些我做的功能来说明一下它们的作用。上面也提到了,对于VASP网上只有一套成熟的perl脚本可用,导致当年我不得不去学perl。所以最近我也在准备把perl的主要功能搬到python上,主要是perl脚本里的Vasp.pm模块。
https://github.com/Mabinogiysk/VASP-script
这个模块实现了POSCAR文件的读取和写入,分数坐标和笛卡尔坐标的转换等功能。这样在写其它脚本时,只需要从模块中导出相应的功能,大大简化了脚本的实现。现在已经完成了read_poscar()和write_poscar()以及分数坐标和笛卡尔坐标转换的功能,有兴趣的朋友也可以来帮助开发。
python脚本功能:
1. 不同格式文件之间的转换
比如vasp和gjf文件之间的转换,vasp和cif文件之间的转换,笛卡尔坐标和分数坐标之间的转换。
这些都是常用功能,如果用shell script来实现将会非常麻烦。
现在只需要导入VASP.py模块,使用一行代码就能读取POSCAR文件:
- import VASP.py
- ...
- lattice, basis, elements, num_atoms, selectiveflag, coordinate_type, coordinates, selective = read_poscar(file_name)
- ...
- write_poscar(file_name, lattice, basis, elements, num_atoms, selectiveflag, coordinate_type, coordinates, selective)
自动给出基矢,元素种类和数量,坐标等信息。对元素操作之后,再用一行代码就能把这些信息写回到POSCAR中,非常方便。
2. 频率计算之后,把OUTCAR里的虚频提取出来,再转化为在VMD里可以播放动画的文件格式xyz:
- > imagefreq.py
- --------------------Processing--------------------
- freq18
- --------------------Done--------------------
- > freqmov.pl POSCAR freq18 30 0.6
- ################ This script makes animation of vibration ################
- Processing freq18
- ------------------ Done ------------------
freqmov.pl 可以把提取出的虚频转化为VMD可以读取的动画文件xyz,具体的说明和用法链接里有。这个功能用shell script做几乎是不现实的,但用高级语言能很容易做出来。在上面连接里的example文件夹下有两个实例,感兴趣的同学可以去看一下。
3. moviecombine.pl:提取NEB计算的image的信息做成动画
(, 下载次数 Times of downloads: 114)
从image1到image8每一步的坐标都提取出来做成动画。找出一个合适的构型接着跑dimer就能很容易找到过渡态。
对于perl、python这样的语言,可以说只有想不到的用法,没有做不出来的功能。学会使用这些编程语言,无疑还能进一步提高工作效率。
作者Author: 冰释之川 时间: 2017-7-15 10:38
占楼咨询一个问题:python 入门什么教材比较好,想买一本纸质版的书自学
作者Author: ulosggs 时间: 2017-7-15 12:33
没必要
http://www.kuqin.com/abyteofpython_cn/
两三个小时就看完了
作者Author: ulosggs 时间: 2017-7-15 12:37
perl 写的我想死啊,跟乱码一样,可读性跟 sh, sed, awk 半斤八两。但是MS脚本只能用 perl,不得不学。
作者Author: ruanyang 时间: 2017-7-15 17:19
https://www.zhihu.com/question/27522719/answer/198439045
推荐下知乎上的讨论
作者Author: ggdh 时间: 2017-7-15 18:43
本帖最后由 ggdh 于 2017-7-15 18:51 编辑
感觉perl有点野,说什么:
“There is more than one way to doing something”
这对于有选择恐惧症来说,简直是噩梦。
另外从维护以及共同开发角度说,倾向python,程序写好了可以直接看,注释都不需要,加上强制缩进。符合clean code的审美。
perl据说是write-only的脚本。。。
作者Author: sky 时间: 2017-7-15 22:10
当年学vtst的脚本就痛苦的要死,perl入门教程看完了还看不懂人家写了什么。
其实我觉得最痛苦的是没有ide和只能用命令行调试,好在现在终于弃坑了。
作者Author: sky 时间: 2017-7-15 22:16
python简明教程吧,只看过这个。
我是有C++/java/perl的底子才来学python的,基本什么都没看过。多写几个脚本,遇到不懂的地方百度一下,自然而然就会了。。。
说真的,比起前面那些python实在太简单了。
作者Author: sky 时间: 2017-7-15 22:22
所以我最后还是弃坑了
作者Author: ggdh 时间: 2017-7-15 22:57
本帖最后由 ggdh 于 2017-7-15 22:59 编辑
找那种一天简易入门的教程,然后开始写小项目,有问题直接google,stackoverflow上面一般都会有不错的解决方案。写过几个小项目,有点感觉之后,可以看相关的书籍比如:Fluent python, Python Cookbook 3, Numpy Cookbook, Effective python, Mastering Pandas, Mastering Matplotlib, Python in Practice,提高代码的质量。
作者Author: 薛定谔的猫 时间: 2017-7-17 22:22
用python做科学计算
作者Author: hxd_yi 时间: 2019-4-16 21:31
个人觉得虽然也许perl的开发者最初是把perl作为一种胶水语言来处理的,而由于它强大的正则表达式处理能力,所以基本上变成了一种文本处理工具。而python很适合作为一种胶水语言。shell看人吧,sed和awk都可以单独作为一门语言来学习,逻辑太复杂的时候不好用,简单的文本处理,尤其是只需要读一遍就能处理完的文档,用shell还是很高效的,很多时候只需要一行就能解决问题。
作者Author: 一颗赛艇 时间: 2019-4-20 09:50
那段awk写错了吧,a到g几个一直当普通变量用,最后怎么当成数组了?
作者Author: a815648905 时间: 2019-12-18 09:27
老师,网站失效了,还有别的途径吗
作者Author: hujunchi 时间: 2020-7-21 16:02
python最经典的还是《python学习手册》,厚是厚一点,但认真看完绝对受益匪浅
作者Author: ArchieMiao 时间: 2020-7-21 18:30
perl和python都是非常优秀的语言。没有必要厚此薄彼。 多用用就好了。
欢迎光临 计算化学公社 (http://bbs.keinsci.com/) |
Powered by Discuz! X3.3 |