You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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序列化的分子对象解析,因此抛出格式错误。

修复步骤

  1. 修正molColName参数:指定实际存储分子对象的列,比如你生成的ROMol或Mol_H列:
    PandasTools.WriteSDF(pp, args.output_file, molColName='Mol_H', properties=list(pp.columns))
    
  2. 修复分子嵌入代码:当前pp["Mol_H"].map(AllChem.EmbedMolecule)没有保存嵌入结果,需要赋值给新列以确认嵌入状态:
    pp["embed_status"] = pp["Mol_H"].map(AllChem.EmbedMolecule)
    
  3. 升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:05:23