按任务学习

用 Python 从 SMILES CSV 创建 SDF 库

将有效 CSV 行写为本地 SDF 记录,同时在 CSV 报告中保留每个输入行和解析错误。

完成内容

有效结构的 molecules.sdf,以及保留 CSV 行号、名称、SMILES、状态和错误的 molecule-report.csv。

步骤

  1. 创建含 name 和 smiles 列的 molecules.csv,并保留源文件副本。
  2. 在本地解析每一行,将 source_row 和 source_smiles 写为 SD 属性,只将有效结构写入 SDF。
  3. 在筛选或解释输出前,写出包含所有源行的 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 字段不能证明化学身份、立体化学意图、材料来源、安全性或实验有效性。

下一步

从 SMILES 写出一条 SDF 记录