按任务学习
用 Python 从 SMILES CSV 创建 SDF 库
将有效 CSV 行写为本地 SDF 记录,同时在 CSV 报告中保留每个输入行和解析错误。
完成内容
有效结构的 molecules.sdf,以及保留 CSV 行号、名称、SMILES、状态和错误的 molecule-report.csv。
步骤
- 创建含 name 和 smiles 列的 molecules.csv,并保留源文件副本。
- 在本地解析每一行,将 source_row 和 source_smiles 写为 SD 属性,只将有效结构写入 SDF。
- 在筛选或解释输出前,写出包含所有源行的 molecule-report.csv。
import csv
import chematic
report = []
with open("molecules.csv", newline="", encoding="utf-8") as src, \
+ chematic.SDWriter("molecules.sdf") as sdf:
for source_row, row in enumerate(csv.DictReader(src), start=2):
smiles = row.get("smiles", "").strip()
name = row.get("name", "").strip() or f"row_{source_row}"
try:
mol = chematic.from_smiles(smiles)
mol.SetProp("_Name", name)
mol.SetProp("source_row", str(source_row))
mol.SetProp("source_smiles", smiles)
sdf.write(mol)
report.append({"source_row": source_row, "name": name, "smiles": smiles, "status": "written", "error": ""})
except ValueError as error:
report.append({"source_row": source_row, "name": name, "smiles": smiles, "status": "invalid_smiles", "error": str(error)})
with open("molecule-report.csv", "w", newline="", encoding="utf-8") as out:
writer = csv.DictWriter(out, fieldnames=["source_row", "name", "smiles", "status", "error"])
writer.writeheader()
writer.writerows(report)预期结果
输入 ethanol、benzene 和不完整的 C1CC 后,molecules.sdf 含两条 V2000 记录。molecule-report.csv 保留全部三行,C1CC 会标为 invalid_smiles 而不会消失。
遇到问题时
只有解析成功后才写出 SDF 记录。在将缺少记录视为化学结果之前,请保留源 CSV 并检查 molecule-report.csv。自动生成的二维坐标和 SD 字段不能证明化学身份、立体化学意图、材料来源、安全性或实验有效性。