2017-07-16 19 views
-1

我是學習python的新手,我真的需要完成這項工作,而且我真的不知道如何尋找答案,看起來像什麼信息巨大的巨大海洋。我應該如何在python中爲單個操作編寫多個循環

我一個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'}}

的事情是,我不只是一個單一的工作文件(在「文件名」下定義),但我有我需要提取「標題」的數百個文件,並且只保留所述標題的「複合」變量。

我知道我必須寫爲循環做,我試過如下:

#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,文件名) 文件「 /usr/local/lib/python2.7/dist-packages/Bio/PDB/PDBParser.py「,第82行,在get_structure中 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循環很好的選擇。我建議你使用一個列表而不是set來存儲結構和文件名。

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

相關問題