csvをxmlに変換したい(python)

注意:pythonには、csvという素敵なモジュールがあるので、そっち使ったほうがイイ、と気付かず色々と余計なコードを書いています。


こういうヘッダつきのデータがあって

id,  name,       age, phone,         updatetime
1 ,  dora,        10, 090-0000-0000, 2012/01/01 11:22:33
2 ,  nobita,      12, 090-1111-0000, 2012/02/01 12:22:33
3 ,  ジャイ子,     10, 090-2222-0000, 2012/03/01 11:23:01
4 ,  ジャイアン,   12, 090-3333-0000, 2012/04/01 09:22:30
5 ,  スネオ,       12, 090-4444-0000, 2012/05/01 10:22:03

ここから、ヘッダをタグにしたこういう出力を得たい。

<?xml version="1.0" encoding="utf-8" ?>
<data>
  <line><id>1</id><name>dora</name><age>10</age><phone>090-0000-0000</phone><updatetime>2012/01/01 11:22:33</updatetime></line>
  <line><id>2</id><name>nobita</name><age>12</age><phone>090-1111-0000</phone><updatetime>2012/02/01 12:22:33</updatetime></line>
  <line><id>3</id><name>ジャイ子</name><age>10</age><phone>090-2222-0000</phone><updatetime>2012/03/01 11:23:01</updatetime></line>
  <line><id>4</id><name>ジャイアン</name><age>12</age><phone>090-3333-0000</phone><updatetime>2012/04/01 09:22:30</updatetime></line>
  <line><id>5</id><name>スネオ</name><age>12</age><phone>090-4444-0000</phone><updatetime>2012/05/01 10:22:03</updatetime></line>
</data>

と思って、python2.6で書いてみた。
感想。
俺がヘタクソなだけだと思うが、日本語の取扱いがやっぱり簡単じゃない。
selfだらけなのは、もう慣れたけど、後で読みづらくなりやすい気がする(これも俺の能力の問題か)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import fileinput
import codecs
import sys

class CsvConv:
    def __init__(self, filename):
        self.filepath = filename
        self.fileread()

    def enc_guess(self,s):
        """ マルチバイト文字列を受け取り、エンコーディングを判定する """
        encodings = ["ascii", "utf-8", "cp932", "shift-jis", "euc-jp"]
        ret = ""
        for enc in encodings:
            try:
                unicode(s, enc)
                ret = enc
                break
            except UnicodeDecodeError, e:
                enc = ""
        self.enc = enc

    def fileread(self):
        """ self.filepathを読み込んで、行ごとに配列に入れる """
        s = ""
        for line in file(self.filepath, 'r'):
            s += line

        self.enc_guess(s)
        fn = codecs.open(self.filepath, "r", self.enc)
        self.flist = []
        for encline in fn.readlines():
            self.flist.append(self.toList(encline))
        fn.close()
        self.flist

    def toXml(self):
        """ self.flist(csv形式のファイルの配列)をxml形式の文字列にする """
        strxml = ""
        for i in self.flist:
            if self.flist[0] != i:
                strxml += self.toTag(self.flist[0], i)
        
        self.strxml = u"<data>" + strxml + u"</data>"

    def toXmlFile(self,tofile):
        fn = codecs.open(tofile, "w", self.enc)
        fn.write(u'<?xml version="1.0" encodding="utf-8" ?>')
        fn.write(self.strxml)
        fn.close()


    def toList(self, line):
        """ カンマ区切りの行を配列にして返す """
        return map(lambda x: x.strip(), line.split(','))

    def toTag(self, header, data):
        """ ヘッダとデータをリストで受け取り、タグを付けて文字列で返す """
        return "<line>" + "".join(map(unicode, map(lambda x, y: "<" + x + ">" + y + "</" + x + ">", header, data))) + "</line>"


if __name__ == "__main__":
    a = sys.argv[1]
    d = CsvConv(a)
    d.toXml()
    d.toXmlFile(a + ".xml")