Make it possible with Python.

最近Pythonから離れ気味、その他物作りに寄り気味です。

codecs.open() とcsv.reader の組み合わせでUnicodeEncodeErrorエラー

Python2.7でこんなコードを書いたらUnicodeEncodeErrorエラー。

    infile = codecs.open(file, "r", "cp932")   
    
    dat = csv.reader(infile)   
    
    y_sig = []
    
    for row in dat:
        
        y_sig.append(row[6])

IDE上ではエラーにならないが、ソースコードを実行するとエラーになる。

それも、なぜかforの行でUnicodeEncodeErrorエラーが発生。

原因はたぶん、csv.readerがunicode型に対応していないらしいこと。(詳細は不明)

このバージョンの csv モジュールは Unicode 入力をサポートしていません。また、現在のところ、 ASCII NUL 文字に関連したいくつかの問題があります。従って、安全を期すには、全ての入力を UTF-8 または印字可能な ASCII にしなければなりません。

13.1. csv — CSV ファイルの読み書き — Python 2.7ja1 documentation

そこで、以下のように、decodeしてunicode型にするタイミングを後ろにずらしたらokになった。

    infile = codecs.open(file, "rb")   
    
    dat = csv.reader(infile)   
    
    y_sig = []
    
    for row in dat:
        
        y_sig.append(row[6].decode('cp932'))

ついでにunicode型と decode,encodeについて勉強。 特に参考になったページのリンクをメモ。

PythonのUnicodeEncodeErrorを知る - HDEラボ ゼロから概念を学ぶのに役立ちました。わかりやすい。

Unicode HOWTO 詳細で明確に記載されている。

今回は特殊なケースだけど、通常は、できるだけ早めにunicode型にして、その後はギリギリまでunicode型を保つのがいいらしい。

python3で標準がunicode型になると、こんな煩わしさもなくなるんだろうか。