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 

私がやりたいことは次のとおりです。6番目の列の5番目の行(この場合は3.3417)の数値が6より大きいか小さいかをPythonに認識させます。次に、値が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

splitlines()を使用して、テキストのすべての行をリストに分割します。

enumerateメソッドとリスト内包表記のフィルターを使用して、「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 に答える
0

3.3417という値が3列目にあるように思われるので、あなたの質問を理解できないかもしれません。

これを行うには、正規表現が最もクリーンな方法だと思います。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 に答える