はじめに
SDFの解析でエラーになった際に、どのデータがおかしいのか解析したいときがある。そういった場合、SDFを適当に切り出してみて、トライアンドエラーをすることが、ごくまれに(数年に1回)ある。今回、そのタイミングが来たのでツールを作って残すこととした。
仕様
- 何番目から何番目を取得するかをstartとendを指定すると、その間にあるデータを切り出し、別のsdfとして出力する。
- startを省略した場合は1, endを省略した場合は、sdfの一番最後を指定したものとする。
- デバッグ目的で使用することが多いため、RDKitなどインストールが面倒なツールは使わない。
できたソース
こんな感じ。使い方はソースを見れば一目瞭然なので省略。
sdf_cutter.py
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument("-input", type=str, required=True)
parser.add_argument("-output", type=str, required=True)
parser.add_argument("-start", type=int, default=1)
parser.add_argument("-end", type=int, default=None)
args = parser.parse_args()
buf = ""
cnt = 0
with open(args.input, "r", encoding="utf8") as fr:
fw = open(args.output, "w", encoding="utf8")
line = fr.readline()
while line:
line = line.rstrip()
if line == "$$$$":
cnt += 1
if cnt >= args.start and (not args.end or cnt <= args.end):
fw.write(buf)
fw.write("$$$$\n")
buf = ""
else:
buf += line + "\n"
line = fr.readline()
fw.close()
if __name__ == "__main__":
main()
おわりに
- scikit-learnのtrain_test_splitのSDF版を作っても面白いかも。需要はなさそうだけど...