.sdf和.msp文件读取
·
前言
.sdf和.msp文件都可以用来存储分子信息,.sdf文件可以用rdkit读取,.msp文件可以用matchms读取。
读取
rdkit安装
pip install rdkit
.sdf读取

from rdkit import Chem
suppl_h = Chem.SDMolSupplier('../data/HMDB/f_hmdb.sdf') # 得到一个迭代器
mols_h = [mol for mol in suppl_h if mol]
hmdb_smi = [mol.GetProp('SMILES') for mol in mols_h]
hmdb_smi_set = set(hmdb_smi)
分子mol有一些常用的函数:
mol.GetPropsAsDict() # 可以获得分子的所有key及其value
smi = 'COO'
mol.SetProp('SMILES', smi) # 可以设置mol的属性
.msp读取
把.msp文件当成普通的文本文档去读取,主要涉及字符串操作。

def read_msp2mgf(file_path:str, save_path:str=None):
f = open(file_path, 'r')
mols = f.read().split('\n\n')[:-1]
spectra = []
for mol in mols:
lines = mol.split('\n')
Name, DB, InChIKey, SMILES, Precursor_type, Spectrum_type, PrecursorMZ, ExactMass, Num_Peaks =\
None, None, None, None, None, None, None, None, None
correct = True # 格式正确
mz, inten = [], []
for l in lines:
if l.startswith('Name:'):
Name = l.split(': ')[-1]
elif l.startswith('DB:'):
DB = l.split(': ')[-1]
elif l.startswith('InChIKey:'):
InChIKey = l.split(': ')[-1]
elif l.startswith('SMILES:'):
SMILES = l.split(': ')[-1]
if SMILES == 'NA':
correct = False
break # 格式不对直接跳出,没必要继续做
elif l.startswith('Precursor_type:'):
Precursor_type = l.split(': ')[-1]
elif l.startswith('Spectrum_type:'):
Spectrum_type = l.split(': ')[-1]
elif l.startswith('PrecursorMZ:'):
if Spectrum_type == 'MS2' and l.split(': ')[-1] != 'NA':
try:
PrecursorMZ = float(l.split(': ')[-1])
except:
correct = False
print(DB)
break
elif l.startswith('ExactMass:'):
ExactMass = float(l.split(': ')[-1])
elif l.startswith('Num Peaks:'):
Num_Peaks = int(l.split(': ')[-1])
elif ':' not in l:
mz.append(float(l.split(' ')[0]))
inten.append(float(l.split(' ')[1]))
if correct:
mz = np.array(mz)
inten = np.array(inten)
metadata = {'Name':Name, 'InChIKey':InChIKey,'SMILES':SMILES, 'ExactMass':ExactMass,'Num Peaks':Num_Peaks,
'Spectrum_type':Spectrum_type, 'Precursor_type':Precursor_type,'PrecursorMZ':PrecursorMZ}
spectrum = Spectrum(mz, inten, metadata)
spectra.append(spectrum)
if save_path:
save_as_mgf(spectra, save_path)
else:
return spectra
此外可以使用matchms库进行读取:
pip install matchms
使用matchms中的load_from_msp函数:
from matchms.importing import load_from_msp
spectrums = [s for s in load_from_msp("MassBank_NIST.msp")]
结语
有问题欢迎在评论区讨论。
更多推荐

所有评论(0)