|
本帖最后由 卡开发发 于 2019-8-26 22:10 编辑
提供个土方法:你可以按照数据的顺序去生成index=[atom_i,atom_j](i>=j),然后数据data直接用正则表达式抓,然后给定i、j就data(index.index([i,j]))。- import re
- import sys
- import ast
- #作者:卡开发发
- #日期:2019-08-26
- #使用方法:read.py *.log [i,j]
- #*.log为Gaussian输出文件,[i,j]分别是行和列指标
- #(python指标从0开始,所以比Gaussian对应的指标减去1)
- #比如LZ附件的"Total nuclear spin-spin coupling J (Hz)"的[48,30]为-0.245622D+00
- #read.py sscc-test.log. [47,29]结果输出为:
- #-0.245622D+00
- #其余根据需要可进一步进行修改
- #get_link用于得到特定link的输出
- def get_link(num,text):
- #通过输出文件开头的Initial command:...字段获得Gaussian的目录
- gdir=re.findall('Initial\scommand:\n\s(.*)l1\.exe',text)[0]
- #选择Enter xxx.exe和Leave Link xxx之间的内容
- head='\(Enter\s'+gdir+'l'+str(num)+'\.exe\)\n'
- tail='\n\sLeave\sLink\s.?'+str(num)+'\sat\s'
- link=re.findall(head+'(.*)'+tail,text,re.S)[0]
- return link
- #get_info用于从link1002输出的部分读取结果
- def get_info(text):
- #选择density=...到最后的内容
- info_=re.findall('density=\s*\d*.\d*\n(.*)',text,re.S)[0]
- #选择...(Hz):为标题和数据的分隔
- sep='\s\D*\s\(Hz\):'
- titles=re.findall(sep,info_,re.S)
- infos_=re.split(sep,info_,re.S)[1:]
- #数据通过分割后以字典形式保存
- infos=[]
- for i in range(10):
- #数据分割后会被按照顺序排列为一维数组
- #[[0,0],[1,0],[1,1],[2,1]...[5,4],[6,0]...[6,4],[7,0]...]
- data=re.findall('\s(.\d\.\d*D.\d\d)',infos_[i],re.S)
- info={'title':titles[i],'data':data}
- infos.append(info)
- return infos
- #gen_index用于生成与数据一维数组对应的序号
- def gen_index(natoms):
- #先产生一个下三角阵,满足i>=j
- #[0,0]
- #[1,0][1,1]
- #[2,0][2,1][2,2]
- #...
- #[9,0][9,1]... ... [9,9]
- #... ...
- mat=[]
- for i in range(natoms):
- for j in range(natoms):
- if i>=j:
- mat.append([i,j])
- #按j指标范围的顺序重新排列成一维
- #[0,0],[1,0],[1,1],[2,1]...[5,4],[6,0]...[6,4]... #k=0
- #[5,5],[6,5],[6,6],[7,5]...[10,0]...[10,9][11,0]...[11,9] #k=1
- #...
- index=[]
- for k in range(natoms//5+1):
- for num in mat:
- if k*5<=num[1]<(k+1)*5:
- index.append(num)
- return index
- #打开文件,运行参数1用来存放输出文件名
- f=open(sys.argv[1],'r')
- text=f.read()
- #读取link101输出内容来获取原子数目,通过原子数目生成对应的序号
- link101=get_link(101,text)
- natoms=int(re.findall('NAtoms=\s*(\d*)\sNQM=',link101)[0])
- index=gen_index(natoms)
- #读取link1002输出内容来获取我们需要的数据
- link1002=get_link(1002,text)
- infos=get_info(link1002)
- #运行参数2用来存放我们指定的序号,以数组形式
- index_=ast.literal_eval(sys.argv[2])
- #输出序号对应的值
- #此处infos[-1]为"Total nuclear spin-spin coupling J (Hz)",也能换成别的
- print(infos[-1]['data'][index.index(index_)])
复制代码
|
|