1

我对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 

我想做的是:让python识别第6列第5行的数字(在我们的例子中为3.3417)是否大于或小于6。然后,如果值大于6,写FILENAME 文件到一个文本文件。请注意,这块信息在不同文件中的位置会发生变化。也就是说,数字 3.3417 并不总是在同一行。此外,所有数字都在不断变化。

我在想我可能会遍历文本,扫描带有“Gold.Protein.RotatedAtoms”的一行,然后在第 5 行的第 3 行插入。但是如何做到这一点呢?

谢谢你的帮助!

4

3 回答 3

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()
于 2012-08-07T22:08:53.570 回答
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'

您可以修改循环中的条件以查找所需的情况并更改打印以写入文件。

于 2012-08-07T22:29:56.243 回答
0

使用 splitlines() 将文本的所有行拆分为一个列表。

使用枚举方法和列表推导中的过滤器查找带有“Gold.Protein.RotatedAtoms”的行的索引,如下所示:

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

将该索引加 5 以从 all_lines 中获取您需要的行,使用 split() 方法将其拆分为标记,最后使用索引运算符取出第 3 个元素(第 3 个元素 = line.split()[2]) .

于 2012-08-07T15:28:25.883 回答