課題別チュートリアル

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レコードが2件入ります。molecule-report.csvには3行すべてが残り、C1CCは消えずにinvalid_smilesになります。

うまくいかないとき

SDFレコードは解析成功後にだけ書き出します。記録がないことを化学的な結果と扱う前に、元CSVを残し、molecule-report.csvを確認してください。自動生成した2D座標とSDフィールドは、物質同一性、立体化学の意図、試料の由来、安全性、実験的妥当性の証明ではありません。

次の行動

SMILESからSDFレコードを1件書き出す