1
2
3
4
5
6
7
8
9
10 import argparse
11 import csv
12 import os
13 import sys
14
15 from rdkit import Chem
16
17
18 -def Convert(suppl, outFile, keyCol=None, stopAfter=-1, includeChirality=False, smilesFrom=''):
19 w = csv.writer(outFile)
20 mol = suppl[0]
21 propNames = list(mol.GetPropNames())
22 if keyCol and keyCol in propNames:
23 propNames.remove(keyCol)
24
25 outL = []
26 if keyCol:
27 outL.append(keyCol)
28 outL.append('SMILES')
29 outL.extend(propNames)
30 w.writerow(outL)
31 for nDone, mol in enumerate(suppl, 1):
32 if not mol:
33 continue
34 if not smilesFrom or not mol.HasProp(smilesFrom):
35 smi = Chem.MolToSmiles(mol, isomericSmiles=includeChirality)
36 else:
37 smi = mol.GetProp(smilesFrom)
38 tMol = Chem.MolFromSmiles(smi)
39 smi = Chem.MolToSmiles(tMol, isomericSmiles=includeChirality)
40 outL = []
41 if keyCol:
42 outL.append(str(mol.GetProp(keyCol)))
43 outL.append(smi)
44 for prop in propNames:
45 if mol.HasProp(prop):
46 outL.append(str(mol.GetProp(prop)))
47 else:
48 outL.append('')
49 w.writerow(outL)
50 if nDone == stopAfter:
51 break
52 return
53
54
56 """ Initialize the parser for the CLI """
57 parser = argparse.ArgumentParser(description='Convert SDF file to CSV',
58 formatter_class=argparse.RawDescriptionHelpFormatter)
59 parser.add_argument('--key', '-k', metavar='keyCol', default=None, dest='keyCol')
60 parser.add_argument('--chiral', default=False, action='store_true', dest='useChirality')
61 parser.add_argument('--smilesCol', metavar='smilesCol', default='')
62 parser.add_argument('inFilename', metavar='inFile.sdf', type=existingFile)
63 parser.add_argument('outF', nargs='?', type=argparse.FileType('w'), default=sys.stdout)
64 return parser
65
66
68 """ 'type' for argparse - check that filename exists """
69 if not os.path.exists(filename):
70 raise argparse.ArgumentTypeError("{0} does not exist".format(filename))
71 return filename
72
73
75 """ Main application """
76 parser = initParser()
77 args = parser.parse_args()
78 suppl = Chem.SDMolSupplier(args.inFilename)
79 Convert(suppl, args.outF, keyCol=args.keyCol, includeChirality=args.useChirality,
80 smilesFrom=args.smilesCol)
81
82
83 if __name__ == '__main__':
84 main()
85