2017-09-25 66 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