stringモジュールのTemplateクラスの実行テスト

あるファイルの特定の部分だけが異なるアスキーファイルを、いくつか作りたい。その場合、テンプレート機能を使うと作業が楽になる。
PythonのstringモジュールにはTemplateクラスがあり、この文字列の置き変えが自動的にできるため、Tempalteクラスを使うことにする。
最初に雛型となるテンプレートファイルを用意しておく。このファイルの中で、${}の部分が置き変える文字列(プレースホルダ)となる。下のテンプレートファイルの例だと、4箇所にいろいろな文字列を入れたファイルを作ることになる。このファイル名は、例えばfile.templateとしておく。

# a test file
#                  2010/11/26
line1: the 1st value is ${value_1}.
line2: the 2nd value is ${value_2}.
line3: ${value_3}, ${value_4}
EOF

このテンプレートファイルに、具体的な値を入れたファイルを作るためのPythonコードは以下のようになる。

#!/bin/env python
from string import Template

fi = open('file.template', 'r')
fo = open('file.new', 'w')

t = Template(fi.read())  # 文字列を引数で渡す
d = dict()
d['value_1'] = 1.0
d['value_2'] = 2.2
d['value_3'] = 3.3
d['value_4'] = 4.4

fo.write(t.substitute(d))
fi.close()
fo.close()

値を辞書で与えて、substituteメソッドを使い置換した文字列をファイルに書き込んでいる。作成されたファイル(file.new)は以下の通り。

# a test file
#                  2010/11/26
line1: the 1st value is 1.0.
line2: the 2nd value is 2.2.
line3: 3.3, 4.4
EOF

便利。
テンプレートに渡す辞書に、テンプレートに無い余計なキーが定義されていても、エラーとはならない。例えば、

d['value_5'] = 10
d['hoge'] = "12345"

が辞書dに定義されていてもよい。
逆にテンプレート中のキーが辞書dに未定義だと、KeyErrorになる。