PythonでGaussianのTDのlogからsingletとtripletのエネルギーを抽出してcsvにまとめる
前回の応用編ということでだいたいの構成は似てます。
#!/usr/bin/env python
# coding: utf-8
import sys
import os
from os import chdir
import re
import argparse
import openpyxl
from openpyxl.styles import numbers
import openpyxl.drawing.image
from io import BytesIO
import glob
今回はディレクトリ(フォルダ)内の全てのファイルに対して処理を実行するために,def get_current_dir():の下に書いたコードでアプリケーションを置いたディレクトリのパスを取得しています。data_extraction(f)は前回と同様。
def get_current_dir():
if getattr(sys, "frozen", False):
return path.dirname(sys.executable)
else:
return os.getcwd()
def data_extraction(f):
try:
with open(f, 'r') as glog:
s = glog.read()
return s
except:
print("Error for " + f)
sの中のどこをキーワードとして引っ掛けて拾ってくるかの指定などは、前回説明した通り、TDの場合、tripletを計算しているときと計算していない時があるので、try/exceptでtripletがないときはerror行を返して、そもそもTDですらないときも、error行を返しています。
def text_extraction(s):
try:
SS = s .rfind(' Excitation energies and oscillator strengths:')
SE = s .rfind('SavETr:')
ESS = s[SS:SE]
ST1 = ESS .find('Singlet')
ST2 = ESS .rfind('Singlet')
ESSE = ESS[ST1:ST2]
ST1 = ESSE .find('Singlet')
ST2 = ESSE .rfind('Singlet')
ESSE1 = ESSE[ST1:ST2]
Sa1 = ESSE1 .find(' ')
Se1 = ESSE1 .find(' eV ')
Sa2 = ESSE1 .find(' nm ')
Se2 = ESSE1 .find(' f=')
Sa3 = ESSE1 .find(' <S**2>=')
Se3 = ESSE1 .find('Excited State ')
S1E = ESSE1[Sa1:Se1]
S2E = ESSE1[Se1:Sa2]
S3E = ESSE1[Se2:Sa3]
STS = ESSE1[Sa3:Se3]
S1E = S1E.replace(' ',' ')
S2E = S2E.replace(' eV ',' ')
S3E = S3E.replace(' f=',' ')
STS = S3E.replace('<S**2>=0.000',' ')
singlet = str(S1E) + ',' + str(S2E) + ',' + str(S3E)
try:
TT1 = ESS .find('Triplet')
TT2 = ESS .rfind('Triplet')
ETSE = ESS[TT1:TT2]
TT1 = ETSE .find('Triplet')
TT2 = ETSE .rfind('Triplet')
ETSE1 = ETSE[TT1:TT2]
Ta1 = ETSE1 .find(' ')
Te1 = ETSE1 .find(' eV ')
Ta2 = ETSE1 .find(' nm ')
T1E = ETSE1[Ta1:Te1]
T2E = ETSE1[Te1:Ta2]
T1E = T1E.replace(' ',' ')
T2E = T2E.replace(' eV ',' ')
triplet = str(T1E) + ',' + str(T2E)
sts = singlet + ',' + triplet
return sts
except:
triplet = 'error' + ',' + '-'
return triplet
return sts
except:
sts = 'error' + ',' + '-' + ',' + '-' + ',' + '-' + ',' + '-' + ',' + '-'
return sts
def singlet_triplet_extraction(flist):
output = ''
for f in flist:
s = data_extraction(f)
sts = text_extraction(s)
f = os.path.basename(f)
out = str(f.replace('.log','')) + ',' + sts + '\n'
output = output + out
return output
前回はglob.glob(dpath + '/*.log', recursive=True)としていたものを,今回は/**を足してglob.glob(dpath + '/**/*.log', recursive=True)として,現在の階層以下のフォルダ内にある.logも探して,flistに入れ,flistに対して上で定義した操作を実行し,RESULT_TD.csvに出力しています。
ここから先は
521字
¥ 100
この記事が気に入ったらサポートをしてみませんか?