RDKit PandasTools.WriteSDF报Bad pickle format错误求助
问题:RDKit PandasTools.WriteSDF 报 pickle 格式错误
错误信息
执行以下代码时触发错误:
PandasTools.WriteSDF(pp, args.output_file, molColName='ID', properties=list(pp.columns))
错误栈:
File "/scratch/micromamba/envs/biotools_py39/lib/python3.9/site-packages/rdkit/Chem/PandasTools.py", line 440, in WriteSDF mol = Chem.Mol(row[1][molColName]) RuntimeError: Bad pickle format: unexpected End-of-File while reading
已尝试将 pandas 升级至 2.0.0,问题仍未解决。
完整代码
import pandas as pd from pprint import pprint from rdkit.Chem import PandasTools from rdkit import Chem from rdkit.Chem import AllChem pp = pd.read_csv(args.input_file) PandasTools.AddMoleculeColumnToFrame(pp,'smiles') pp["Mol_H"] = pp["ROMol"].apply(Chem.AddHs) pp["Mol_H"].map(AllChem.EmbedMolecule) pprint(pp) PandasTools.WriteSDF(pp, args.output_file, molColName='ID', properties=list(pp.columns))
关联错误
仅使用 pandas(不使用 dask)时,会触发另一个错误:
PandasTools.WriteSDF(pp, args.output_file, molColName='ID', properties=list(pp.columns))
错误栈:
File "/scratch/micromamba/envs/biotools_py39/lib/python3.9/site-packages/rdkit/Chem/PandasTools.py", line 440, in WriteSDF mol = Chem.Mol(row[1][molColName]) RuntimeError: Bad pickle format: bad endian ID or invalid file format
环境配置
- RDKit版本:vRelease_2017_09
- 操作系统:Ubuntu 20.04
- Python版本:3.9
- 使用conda:是
- conda安装RDKit渠道:
conda install conda-forge::rdkit
输入CSV内容
ID,smiles 1,O1CC[C@@H](NC(=O)[C@@H](Cc2cc3cc(ccc3nc2N)-c2ccccc2C)C)CC1(C)C 2,Fc1cc(cc(F)c1)C[C@H](NC(=O)[C@@H](N1CC[C@](NC(=O)C)(CC(C)C)C1=O)CCc1ccccc1)[C@H](O)[C@@H]1[NH2+]C[C@H](OCCC)C1 3,S1(=O)(=O)N(c2cc(cc3c2n(cc3CC)CC1)C(=O)N[C@H]([C@H](O)C[NH2+]Cc1cc(OC)ccc1)Cc1ccccc1)C 4,S1(=O)(=O)C[C@@H](Cc2cc(O[C@H](COCC)C(F)(F)F)c(N)c(F)c2)[C@H](O)[C@@H]([NH2+]Cc2cc(ccc2)C(C)(C)C)C1 5,S1(=O)(=O)N(c2cc(cc3c2n(cc3CC)CC1)C(=O)N[C@H]([C@H](O)C[NH2+]Cc1cc(ccc1)C(F)(F)F)Cc1ccccc1)C 6,S1(=O)C[C@@H](Cc2cc(OC(C(F)(F)F)C(F)(F)F)c(N)c(F)c2)[C@H](O)[C@@H]([NH2+]Cc2cc(ccc2)C(C)(C)C)C1 7,S(=O)(=O)(CCCCC)C[C@@H](NC(=O)c1cccnc1)C(=O)N[C@H]([C@H](O)C[NH2+]Cc1cc(ccc1)CC)Cc1cc(F)cc(F)c1 8,Fc1c2c(ccc1)[C@@]([NH+]=C2N)(C=1C=C(C)C(=O)N(C=1)CC)c1cc(ccc1)-c1cc(cnc1)C#CC 9,O1c2c(cc(cc2)CC)[C@@H]([NH2+]C[C@@H](O)[C@H]2NC(=O)C=3C=CC(=O)N(CCCCc4cc(C2)ccc4)C=3)CC12CCC2 10,O=C1N(CCCC1)C(C)(C)[C@@H]1C[C@@H](CCC1)C(=O)N[C@H]([C@H](O)C[NH2+]Cc1cc(ccc1)C(C)C)Cc1ccccc1
解决方案
核心问题
PandasTools.WriteSDF 的 molColName 参数需要指定存储RDKit分子对象的列,但你传入了整数类型的ID列。RDKit尝试将ID的整数值当作pickle序列化的分子对象解析,因此抛出格式错误。
修复步骤
- 修正
molColName参数:指定实际存储分子对象的列,比如你生成的ROMol或Mol_H列:PandasTools.WriteSDF(pp, args.output_file, molColName='Mol_H', properties=list(pp.columns)) - 修复分子嵌入代码:当前
pp["Mol_H"].map(AllChem.EmbedMolecule)没有保存嵌入结果,需要赋值给新列以确认嵌入状态:pp["embed_status"] = pp["Mol_H"].map(AllChem.EmbedMolecule) - 升级RDKit版本:你使用的2017_09版本过于老旧,与Python3.9、pandas2.0兼容性极差,建议升级到最新稳定版:
conda update -c conda-forge rdkit
修复后完整代码
import pandas as pd from pprint import pprint from rdkit.Chem import PandasTools from rdkit import Chem from rdkit.Chem import AllChem pp = pd.read_csv(args.input_file) PandasTools.AddMoleculeColumnToFrame(pp,'smiles') pp["Mol_H"] = pp["ROMol"].apply(Chem.AddHs) # 保存分子嵌入状态,排查嵌入失败的情况 pp["embed_status"] = pp["Mol_H"].map(AllChem.EmbedMolecule) pprint(pp) # 指定正确的分子列 PandasTools.WriteSDF(pp, args.output_file, molColName='Mol_H', properties=list(pp.columns))
内容的提问来源于stack exchange,提问作者M.Vu
相关产品推荐
相关产品推荐

