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")