我编写了一个脚本来检索和处理蛋白质数据库中的信息。我从Bio.PDB.MMCIF2Dict导入MMCIFDict模块,该模块允许解析字典中的CIF数据。它几乎适用于我列表中的所有结构,但我不知道为什么,对于某些结构而言,它崩溃了。例如,对于PDBid 4asd,它返回键而不是值,并返回值而不是键。就像解析器翻转键和值的属性一样。
我发现的唯一解决方案是检查MMCIFDict模块生成的字典中预期的键是否存在。如果没有,我必须在相应字典的所有值中找到它。
import urllib.request
from Bio.PDB.MMCIF2Dict import MMCIF2Dict
pdb_list = ['4asd']
cif_webpage = urllib.request.urlopen(f'https://files.rcsb.org/header/{pdb}.cif').read().decode('utf-8').split('\n')
dico = MMCIF2Dict(cif_webpage)
dico['_entity_src_gen.pdbx_gene_src_scientific_name'] == 'HOMO SAPIENS'
KeyError: '_entity_src_gen.pdbx_gene_src_scientific_name'
期望键不是键,而是期望值的值,现在它是键(希望我不会失去你):
dico['HOMO SAPIENS'] == '_entity_src_gen.pdbx_gene_src_scientific_name'
感谢您的帮助!
您传递给MMCIF2Dict
的是一个字符串列表,而根据docs参数应为:
文件-PDB文件的名称或打开的文件句柄
我下载了header / 4asd.cif,并验证了如果该参数是文件句柄,它是否可以正常工作。
或者,您可以使用gemmi解析CIF文件(免责声明:我正在研究这个项目)
from gemmi import cif
import urllib.request
pdb = '4asd'
with urllib.request.urlopen(f'https://files.rcsb.org/header/{pdb}.cif') as c:
doc = cif.read_string(c.read())
category_dict = doc[0].get_mmcif_category('_entity_src_gen')
assert category_dict['pdbx_gene_src_scientific_name'] == ['HOMO SAPIENS']