2017-07-16 8 views
-1

私はPythonを学ぶのが初めてで、この仕事をやる必要があります。情報の大きな巨大な海。Pythonの1回の操作で複数のループを書くにはどうすればいいですか?

私はPDBパーサで働いていると私は、次のコードを持っている。この結果に

#Calling the module 
from Bio.PDB.PDBParser import PDBParser 

#Defining some variables 
parser = PDBParser(PERMISSIVE=1) 
structure_id= "3caq" 
filename = "3caq.pdb" 

#This is the actual task to be done 
structure = parser.get_structure(structure_id, filename) 

#What I'm interested in doing 
compound = structure.header['compound'] 
print structure_id + " |", compound 

を:

3caq | {'1': {'synonym': 'delta(4)-3-ketosteroid 5-beta-reductase, aldo-keto reductase family 1 member d1 ', 'chain': 'a, b', 'misc': '', 'molecule': '3-oxo-5-beta-steroid 4-dehydrogenase', 'ec_number': '1.3.1.3','ec': '1.3.1.3', 'engineered': 'yes'}}

事は、私は1つだけで作業していないよということですファイル( "ファイル名"の下で定義されています)しかし、私は "ヘッダー"を抽出する必要があり、上記のヘッダーの "複合"変数だけを保持する必要があるファイルから何百ものファイルを持っています。

私はその行われ、私は次のことを試したことへのためのループを記述する必要が知っている:

#Defining lists 
nicknames = { "3caq", "2zb7" } 
structures = { "3caq.pdb", "2bz7.pdb" } 

structure_id = [] 
for structure in structures: 
     structure_id.append(nickname) 
filename = [] 
for structure in structures: 
     filename.append(structure) 

その後、私はパーサを養うが、私はエラーを取得します。

Traceback (most recent call last): 
    File "/home/tomas/Escritorio/d.py", line 16, in <module> 
    header = parser.get_structure(structure_id, filename) 
    File "/usr/local/lib/python2.7/dist-packages/Bio/PDB/PDBParser.py" 
    , line 82, in get_structure 
    self._parse(handle.readlines()) 
AttributeError: 'list' object has no attribute 'readlines' 

ループが正しく書かれていないことは間違いありません。

私はループを正しく書く方法について、私が確認できるリソースを使って、または適切なコマンドを使って助けを得ることができれば、本当に感謝しています。

よろしくお願いいたします。

+0

_「私はエラーを取得します」_ - あなたが得ている完全なエラーを投稿できますか? –

+0

は申し訳ありませんが、私はそれについて – TFdoe

+0

トレースバック(最新の呼び出しの最後)忘れてしまった: ヘッダーで、 ファイル "/home/tomas/Escritorio/d.py"、16行を= parser.get_structure(structure_id、ファイル名) ファイル」 get_structure内の/usr/local/lib/python2.7/dist-packages/Bio/PDB/PDBParser.py "、82行目 self._parse(handle.readlines()) AttributeError: 'list'オブジェクトには属性がありません'readlines' – TFdoe

答えて

0

get_structure()に文字列("3caq.pdb")が必要な場合は、リスト(["3caq.pdb"])を渡すため、エラーが発生しています。より良いコードを作成するには

from Bio.PDB.PDBParser import PDBParser 

files = {"3caq.pdb", "2bz7.pdb"} 

for filename in files: 
    # Defining some variables 
    parser = PDBParser(PERMISSIVE=1) 

    # Drop ".pdb" from filename to get structure_id 
    structure_id = filename.split('.')[0] 

    # This is the actual task to be done 
    structure = parser.get_structure(structure_id, filename) 

    # What I'm interested in doing 
    compound = structure.header['compound'] 

    print("{} | {}".format(structure_id, compound)) 

、私は別の関数としてそれを記述します:ここで

は、複数のファイルをサポートすることができる方法である

from Bio.PDB.PDBParser import PDBParser 

def get_compound_header(filename): 
    # Defining some variables 
    parser = PDBParser(PERMISSIVE=1) 

    # Drop ".pdb" from filename to get structure_id 
    structure_id = filename.split('.')[0] 

    # This is the actual task to be done 
    structure = parser.get_structure(structure_id, filename) 

    # What I'm interested in doing 
    compound = structure.header['compound'] 

    return "{} | {}".format(structure_id, compound) 


# Main function 
if __name__ == "__main__": 

    files = {"3caq.pdb", "2bz7.pdb"} 

    for filename in files: 
     print(get_compound_header(filename)) 
0

明確な理解があれば、この問題を解決するのに役立ちます。

forループで多くの構造を繰り返し処理する必要があります。構造とファイル名を格納する代わりにリストを使うことをお勧めします。

filenames = ["3caq", "2zb7" ] 
structures = ["3caq.pdb", "2bz7.pdb"] 

これで構造体の長さで反復処理を行うことができます。

for each in range(len(structures)): 
    structure = parser.get_structure(structures[each], filenames[each]) 

    compound = structure.header['compound'] 
    print structure_id + " |", compound 

これがうまくいくかどうか教えてください。

+0

ああ、そうです!ありがとう:)私はそれを編集します インデックスを持つものはここで役立ちます。 –

+1

[zip](https://docs.python.org/3/library/functions.html#zip)を使用して、ニックネームとファイル名をペアにしてインデックスを削除することができます。 – wwii

+0

私はそれに取り組んでいます! – TFdoe

関連する問題