文字コードで悩んだ
悩んだのは 1.のところ。
import cx_Oracle con = cx_Oracle.connect( username/password@DTS ) cur = con.cursor() reader = cur for item in reader: 主処理
ってお約束な処理ですが。この cur イテレータの出力が今の環境だと SJIS 確定*1なので、こいつをなんとか unicode に変換したい。でも reader んところは別のインプットとの共通の切り口になっているので、item に入った中身を後から変換する処理はしたくなかった。
んで苦肉の策。
class UnicodeWrapper( object ): def __init( self, cursor, encoding='sjis'): self.cursor = cursor self.encoding = encoding def __iter__( self ): return self def next( self ): row = self.cur.next() return[ unicode(str(s), self.encoding) for s in row ]
ってして、上の reader = cur んところを
reader = UnicodeWrapper( cur )
って逃げた。インチキ・イテレータークラスだ(笑)。絶対にもっとスマートなやり方があるはず。cx_Oracle の cursor クラスを継承してステキに作り換えるとかな!
…でも動いたからいいや(重要)。