2012-08-07 100 views
1

我對python很新,所以請耐心等待。通過循環找到一個值,多個文件python

我有一個帶有原子座標的文件。這些文件以某種方式顯示,但座標不一定在同一行上。該文件還包含一些文本,下面是其中很重要的文件的一部分:

<Gold.Protein.RotatedAtoms> 
    28.5571 85.1121 3.9003 C.ar 0 0 0 0 0 0 0 0 0 0 0 0 
    27.3346 84.9085 3.2531 C.ar 0 0 0 0 0 0 0 0 0 0 0 0 
    28.9141 86.4057 4.2554 C.ar 0 0 0 0 0 0 0 0 0 0 0 0 
    26.4701 85.9748 2.9810 C.ar 0 0 0 0 0 0 0 0 0 0 0 0 
    28.0456 87.4704 3.9845 C.ar 0 0 0 0 0 0 0 0 0 0 0 0 
    26.8436 87.2569 3.3417 C.ar 0 0 0 0 0 0 0 0 0 0 0 0 
    26.1924 88.0932 3.1196 H 0 0 0 0 0 0 0 0 0 0 0 0 
    27.0510 83.9062 2.9565 H 0 0 0 0 0 0 0 0 0 0 0 0 

我想要做的是以下幾點: 得到蟒蛇承認如果在第5行的數量第6列(在我們的例子中爲3.3417)大於或小於6.然後,如果值大於6,則將文件的FILENAME寫入文本文檔。請注意,這部分信息的位置在不同的文件中發生變化。也就是說,數字3.3417並不總是在同一行。另外,所有的數字都會隨時變化。

我在想,我可能會通過文字環路,掃描爲一個符合「Gold.Protein.RotatedAtoms」,然後從第三個插線5日線向下行。但是,如何做到這一點?

感謝您的幫助!

+0

它聽起來像你想知道一個文件是否包含字符串「3.3417」,或者我錯了嗎? – 2012-08-07 15:30:59

回答

0

使用分割線()將文本的所有行分割成列表。

查找行的索引與「Gold.Protein.RotatedAtoms」使用枚舉法,並在列表中理解一個過濾器,這樣的事情:

index = [index for index,line in enumerate(all_lines) if "Gold.Protein.RotatedAtoms" in line] 

添加5到指數獲得行你需要從all_lines中,使用split()方法將它拆分爲標記,最後用index操作符取出第三個元素(第三個元素= line.split()[2])。

0

正如Lanaru所說...你可以從文件中讀取數據並將文件分割成數組。

像這樣:

#!/usr/bin/env python 


def s_coord(): 
    fo = open('Gold.Protein.RotatedAtoms') 
    count = 1 
    for i in fo.readlines(): 
     array = i.split() 

     if array[2] == "3.3417": 
       print("Element 3.3417 is in the {0} row.".format(count)) 


     count = count + 1 




def main(): 
    s_coord() 

    return 0 

if __name__ == '__main__': 
    main() 
0

在我看來,該值3.3417是在第三列,所以我可能不明白你的問題。

我認爲正則表達式是最乾淨的方式。我使用http://kodos.sourceforge.net/來創建以下正則表達式和代碼。

import re 

# common variables 
rawstr = r"""^\s*([0-9.]+)\s*([0-9.]+)\s*([0-9.]+)\s*([a-zA-Z.]+)""" 
matchstr = """<Gold.Protein.RotatedAtoms> 
    28.5571 85.1121 3.9003 C.ar 0 0 0 0 0 0 0 0 0 0 0 0 
    27.3346 84.9085 3.2531 C.ar 0 0 0 0 0 0 0 0 0 0 0 0 
    28.9141 86.4057 4.2554 C.ar 0 0 0 0 0 0 0 0 0 0 0 0 
    26.4701 85.9748 2.9810 C.ar 0 0 0 0 0 0 0 0 0 0 0 0 
    28.0456 87.4704 3.9845 C.ar 0 0 0 0 0 0 0 0 0 0 0 0 
    26.8436 87.2569 3.3417 C.ar 0 0 0 0 0 0 0 0 0 0 0 0 
    26.1924 88.0932 3.1196 H 0 0 0 0 0 0 0 0 0 0 0 0 
    27.0510 83.9062 2.9565 H 0 0 0 0 0 0 0 0 0 0 0 0""" 

# build a compile object 
compile_obj = re.compile(rawstr, re.MULTILINE) 
match_obj = compile_obj.search(matchstr) 

for values in compile_obj.findall(matchstr): 
    if values[2] == '3.3417': 
     print 'found it' 

您可以在循環中修改條件以查找所需的案例並更改打印以編寫文件。