2013年12月23日月曜日

開発環境

初めてのコンピュータサイエンス(Jennifer CampbellPaul GriesJason MontojoGreg Wilson(著)長尾 高弘(翻訳))の12章(各種ツール)、12.7(練習問題)、12-19.を解いてみる。

12.7(練習問題)、12-19.

コード(BBEdit)

sample.py

#!/usr/bin/env python3.3
#-*- coding: utf-8 -*-

import re

def readMolecule(r):
    line = r.readline()
    if not line:
        return None
    
    try:
        key, name = line.split()
    except:
        raise Exception('分子名の行が欠けている')
    if key != 'COMPND':
        raise Exception("COMPNDの箇所が見つからない")
    if not name:
        raise Exception('分子の名前が欠けている')
    
    molecule = [name]
    reading = True
    
    i = 1
    while reading:
        line = r.readline()
        if line.startswith('END'):
            reading = False
            i = 1
        else:
            try:
                key, num, type, x, y, z = line.split()
            except:
                raise Exception('ATOMの行が欠けている')
            if key != 'ATOM':
                raise Exception('ATOMが見つからない')
            if int(num) != i:
                raise Exception('IDが不正')
            if not re.match(r'^[A-Za-z]+$', type):
                raise Exception('原子記号が不正')
            for n in [x, y, z]:
                if not re.match(r'^(-)?\d+(.)?\d+$', n):
                    raise Exception('座標が不正')
            molecule.append((type, x, y, z))
        i += 1
    return molecule
        

if __name__ == '__main__':
    for file in map(lambda x: 'temp{0}.txt'.format(x), range(1, 10)):
        print(file)
        with open(file) as f:
            try:
                molecule = readMolecule(f)
                if molecule == None:
                    break
                print(molecule)
            except Exception as err:
                print(err)

入出力結果(Terminal)

$ cat -n temp*.txt
     1 COMPND AMMONIA
     2 ATOM 1 N 0.257 -0.363 0.000
     3 ATOM 2 H 0.257 0.727 0.000
     4 ATOM 3 H 0.771 -0.727 0890
     5 ATOM 4 H 0.771 -0.727 -0.890
     6 END
     1 AMMONIA AMMONIA
     2 ATOM 1 N 0.257 -0.363 0.000
     3 ATOM 2 H 0.257 0.727 0.000
     4 ATOM 3 H 0.771 -0.727 0890
     5 ATOM 4 H 0.771 -0.727 -0.890
     6 END     1 COMPND
     2 ATOM 1 N 0.257 -0.363 0.000
     3 ATOM 2 H 0.257 0.727 0.000
     4 ATOM 3 H 0.771 -0.727 0890
     5 ATOM 4 H 0.771 -0.727 -0.890
     6 END     1 COMPND AMMONIA
     2  1 N 0.257 -0.363 0.000
     3 ATOM 2 H 0.257 0.727 0.000
     4 ATOM 3 H 0.771 -0.727 0890
     5 ATOM 4 H 0.771 -0.727 -0.890
     6 END
     1 COMPND AMMONIA
     2 ATOM 1 N 0.257 -0.363 0.000
     3 ATOM 1 H 0.257 0.727 0.000
     4 ATOM 3 H 0.771 -0.727 0890
     5 ATOM 4 H 0.771 -0.727 -0.890
     6 END     1 COMPND AMMONIA
     2 ATOM 1 N 0.257 -0.363 0.000
     3 ATOM 2 10 0.257 0.727 0.000
     4 ATOM 3 H 0.771 -0.727 0890
     5 ATOM 4 H 0.771 -0.727 -0.890
     6 END     1 COMPND AMMONIA
     2 ATOM 1 N 0.257 -0.363 0.000
     3 ATOM 2 H H 0.727 0.000
     4 ATOM 3 H 0.771 -0.727 0890
     5 ATOM 4 H 0.771 -0.727 -0.890
     6 END     1 COMPND AMMONIA
     2 ATOM 1 N 0.257 -0.363 0.000
     3 ATOM 2 H 0.257 0.727 0.000
     4 ATOM 3 H 0.771 H 0890
     5 ATOM 4 H 0.771 -0.727 -0.890
     6 END     1 COMPND AMMONIA
     2 ATOM 1 N 0.257 -0.363 0.000
     3 ATOM 2 H 0.257 0.727 0.000
     4 ATOM 3 H 0.771 -0.727 0890
     5 ATOM 4 H 0.771 -0.727 H
     6 END
$ ./sample.py
temp1.txt
['AMMONIA', ('N', '0.257', '-0.363', '0.000'), ('H', '0.257', '0.727', '0.000'), ('H', '0.771', '-0.727', '0890'), ('H', '0.771', '-0.727', '-0.890')]
temp2.txt
COMPNDの箇所が見つからない
temp3.txt
分子名の行が欠けている
temp4.txt
ATOMの行が欠けている
temp5.txt
IDが不正
temp6.txt
原子記号が不正
temp7.txt
座標が不正
temp8.txt
座標が不正
temp9.txt
座標が不正
$

0 コメント:

コメントを投稿