如何在Python中导入SDF文件?导入遇文件错误问题求助
问题描述
我是编程新手,这是我首次提问,还请见谅。我尝试从ChemBL导入化合物列表,以实现网格展示与分类,但每次导入SDF文件时均提示“Bad input file”错误。我已尝试使用文件路径和文件名,但问题依旧,无法定位错误。请问是否需要逐个处理每个化合物的.sdf文件再进行打印?
相关代码
from rdkit import Chem from rdkit.Chem import AllChem sd_supplier = Chem.SDMolSupplier(r'C:\Users\abc\Downloads\DOWNLOAD-kFj-7sO59mDkb3HHrtKd0_C9Qh8SCpVsEFJstjEfSUw=\DOWNLOAD-kFj-7sO59mDkb3HHrtKd0_C9Qh8SCpVsEFJstjEfSUw=.sdf') for mol in sd_supplier: name = mol.GetProp('Name') smiles = Chem.MolToSmiles(mol) print(f'Molecule: {name}') print(f'SMILES: {smiles}')
错误信息
OSError Traceback (most recent call last) <ipython-input-33-a625f28bcf9e> in <cell line: 2>() ---->3 sd_supplier = Chem.SDMolSupplier(r'C:\Users\abc\Downloads\DOWNLOAD-kFj-7sO59mDkb3HHrtKd0_C9Qh8SCpVsEFJstjEfSUw=\DOWNLOAD-kFj-7sO59mDkb3HHrtKd0_C9Qh8SCpVsEFJstjEfSUw=.sdf') OSError: File error: Bad input file C:\Users\abc\Downloads\DOWNLOAD-kFj-7sO59mDkb3HHrtKd0_C9Qh8SCpVsEFJstjEfSUw=\DOWNLOAD-kFj-7sO59mDkb3HHrtKd0_C9Qh8SCpVsEFJstjEfSUw=.sdf
(*该行每次都会抛出错误,我尝试过使用实际文件名和文件路径,但均无效。)
解决建议
不需要逐个处理单个化合物的SDF文件,RDKit的SDMolSupplier本身支持批量读取多分子SDF。问题大概率出在文件路径或文件本身,按以下步骤排查:
验证文件路径
- 复制路径到文件资源管理器,确认文件真实存在,检查长文件名、特殊字符是否被系统截断或转义
- 将SDF文件移到更简单的路径下(比如
C:\temp\test.sdf),降低路径复杂度 - 确保路径末尾是文件名,避免以反斜杠结尾
检查SDF文件有效性
- 用文本编辑器打开文件,确认格式正常:每个分子块以
$$$$分隔,没有乱码或损坏内容 - 重新从ChemBL导出SDF文件,或用RDKit自带工具修复损坏的文件
- 先导出少量化合物测试,排除大文件读取异常
- 用文本编辑器打开文件,确认格式正常:每个分子块以
添加代码容错
即使路径正确,个别分子可能存在格式问题,修改代码增加判断:from rdkit import Chem sd_supplier = Chem.SDMolSupplier(r'C:\Users\abc\Downloads\your_file.sdf') for idx, mol in enumerate(sd_supplier): if mol is None: print(f'第{idx+1}个分子读取失败,跳过') continue try: name = mol.GetProp('Name') except KeyError: name = f'Unknown_{idx+1}' smiles = Chem.MolToSmiles(mol) print(f'Molecule: {name}') print(f'SMILES: {smiles}')
内容的提问来源于stack exchange,提问作者akhil jumde
相关产品推荐
相关产品推荐

