2017-09-25 128 views
3

我想修改一个脚本。这对我来说很困难,所以我来求助。该脚本应该从一些.out文件中提取数据,然后将它们写入.txt文件。问题是我有两个不同的关键字来寻找。所以,我提供了脚本,我无法修改的东西,然后提供了两个输入文件的例子。如何修改这个脚本来搜索多个关键字?

#!/usr/bin/env python 
# -*- coding: utf-8 

#~ Data analysis 
import glob, subprocess, shutil, os, math 
from funciones import * 
for namefile in glob.glob("*.mol2"): 
    lstmol2 = [] 
    lstG=[] 
    os.chdir("some_directory") 
    searchprocess="grep -i -H 'CURRENT VALUE OF HEAT OF FORMATION =' *.out | sort -k 4 > firstfile.txt" 
#~I need also to look for 'CURRENT BEST VALUE OF HEAT OF FORMATION =' 
    os.system(searchprocess) 

    fileout=open("results.txt","w") 
    filein=open("firstfile.txt", "r") 
    #~ write data in results.txt 
    fileout.write('\t %s \n' %(" HOF")) 

    for line in filein: 
     linediv=line.split() 
     HOF=float(linediv[8]) 

    #~or [10] (for the keyword in need to add) but in both cases I need the float. I need both data of the keywords be included on this file. 
     lstG.append(HOF) 
    fileout.close() 
    filein.close() 

输入数据,类型1:

foofoofooofoofoofoofoofoo 
foofoofooofoofoofoofoofoov 
foofoofooofoofoofoofoofoo 
CURRENT VALUE OF HEAT OF FORMATION = 1928 
foofoofooofoofoofoofoofoo 
foofoofooofoofoofoofoofoov 

输入数据,类型2:

foofoofooofoofoofoofoofoo 
foofoofooofoofoofoofoofoov 
foofoofooofoofoofoofoofoo 
CURRENT BEST VALUE OF HEAT OF FORMATION = 1930 
foofoofooofoofoofoofoofoo 
foofoofooofoofoofoofoofoov 
+0

对我来说,用'HOF = float(linediv [8])'修改行到'linediv [-1]'应该可以工作,看起来它总是最后一部分。 –

+0

谢谢.. @ PrestonHager,但我怎么能找到这两个关键字?我的意思是'形成热的当前价值='和'当前形成热的最佳价值=' – santimirandarp

回答

2

应当更新grep命令查找与?运营商可选字。使用-E标志来启用伸展正则表达式,因此您不必转义正则表达式运算符。始终使用在你的模式单引号:

searchprocess="grep -E -i -H 'CURRENT(BEST)? VALUE OF HEAT OF FORMATION =' *.out | sort -k 4 > firstfile.txt" 

@PrestonHager是正确的,你应该改变linediv[8]linediv[-1],因为在BEST存在的情况下,这个数字将在linediv[9]的位置,但在这两种情况下linediv[-1]会给你想要的结果。

+0

你的答案很好。我会在几分钟内接受。但是如果有另一个关键字会发生什么?你会概括你的答案寻找3个不同的关键字? – santimirandarp

+0

在任何情况下linediv [-1]都可以工作,我相信。 – santimirandarp

+0

'grep'使用正则表达式来匹配文件中的模式,因此您可以使用任何普通的正则表达式运算符将所需的条件添加到您的模式中。正则表达式对于习惯不习惯的人来说看起来很混乱,令人望而生畏,但他们遵循一套非常明确的规则。了解操作员然后考虑需要匹配的模式,并且您将能够找出要使用的操作员。网上有许多正则表达式教程,像这样:https://www.regular-expressions.info/tutorial.html – blendenzo