Task tutorial

Create an SDF library from a SMILES CSV with Python

Write valid CSV rows as local SDF records while keeping every input row and parse error in a CSV report.

You will make

A molecules.sdf file for valid records plus molecule-report.csv that preserves the CSV row, name, SMILES, status, and error.

Steps

  1. Create molecules.csv with name and smiles columns, then keep a source copy.
  2. Parse each row locally, attach source_row and source_smiles SD properties, and write only valid structures to the SDF.
  3. Write molecule-report.csv for every source row before filtering or interpreting output.
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)

Expected result

With ethanol, benzene, and incomplete C1CC inputs, molecules.sdf contains two V2000 records. molecule-report.csv has all three source rows; C1CC is marked invalid_smiles rather than disappearing.

If it does not work

SDF records are written only after parsing succeeds. Preserve the source CSV and inspect molecule-report.csv before treating a missing record as a chemical result. Generated 2D coordinates and SD fields do not prove identity, stereochemical intent, material provenance, safety, or experimental validity.

Next action

Write one SDF record from SMILES