課題別チュートリアル
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レコードが2件入ります。molecule-report.csvには3行すべてが残り、C1CCは消えずにinvalid_smilesになります。
うまくいかないとき
SDFレコードは解析成功後にだけ書き出します。記録がないことを化学的な結果と扱う前に、元CSVを残し、molecule-report.csvを確認してください。自動生成した2D座標とSDフィールドは、物質同一性、立体化学の意図、試料の由来、安全性、実験的妥当性の証明ではありません。