Djangoのテンプレートエンジンを使ってcsvデータをフォーマットして出力する

ある程度量のあるLDIFを作る必要があり、一つ一つ手打ちしていくのもめんどくさい&ミスが恐いので、Excelでデータをまとめ、csvに変換後Djangoのテンプレートエンジンを使って生成しました。

ソース

csv2format.py
import sys,csv
from django.conf import settings
settings.configure(TEMPLATE_DIRS=('./',)) # テンプレートファイルの置き場所
from django.template import Context,loader

if len(sys.argv) != 3:
    print "usage: template.py template_file csv_file"
    sys.exit()

format = (  # csvのフォーマットを指定
            'uidNumber',
            'uid',
            'givenName',
            'sn',
            'mail',
            'userPassword',
)

tmpl = loader.get_template(sys.argv[1])
csvdata = csv.reader(open(sys.argv[2]))

for row in csvdata:
    data = Context(dict(zip(format,row))) # formatと値の辞書を作成
    print tmpl.render(data)

使い方

 % python csv2format.py テンプレートファイル csvファイル

以下のファイルを読み込ませて実行してみます。

ldap.tmpl (テンプレートファイル)

{{要素名}} が値に変換されて出力されます。

dn: uid={{uid}},ou=People,dc=example,dc=com
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
uid: {{uid}}
cn: {{givenName}} {{sn}}
givenName: {{givenName}}
sn: {{sn}}
mail: {{mail}}
shadowMax: 99999
shadowWarning: 7
uidNumber: {{uidNumber}}
gidNumber: 100
loginShell: /bin/bash
homeDirectory: /home/{{uid}}
userPassword:: {{userPassword}}
users.csv
1001,joma,Namae,MYOUJI,joma@example.com,password-string
実行結果
[joma@brain:~]% python csv2format.py ldap.tmpl users.csv
dn: uid=joma,ou=People,dc=example,dc=com
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
uid: joma
cn: Namae MYOUJI
givenName: Namae
sn: MYOUJI
mail: joma@example.com
shadowMax: 99999
shadowWarning: 7
uidNumber: 1001
gidNumber: 100
loginShell: /bin/bash
homeDirectory: /home/joma
userPassword:: password-string

感想

  • LDIF以外にも使えて便利かも
  • スーパーpre記法がLDIFにも対応してることに感心