2012-08-07 97 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' 

您可以在循环中修改条件以查找所需的案例并更改打印以编写文件。