はじめに結論から
Pythonで UTF-8 BOM有りを読み込む場合はエンコードを
'utf_8_sig' と指定する。
ファイルを読み込む例
io.open(filename, "r", encoding="utf_8_sig")
str型(UTF-8)からunicode型に変換
uni_string = unicode(str_string, 'utf_8_sig')
かきはじめに
UTF-8 をPythonで読み込む際にちょっとハマったので、忘失防止として書き留めます。
BOMとは
UTF-8 には BOM(Byte order mark)が付く場合があります。
これはエンコードがUTF-8であるという、識別子です。
ファイルの先頭3バイトが 'EF BB BF' となっています。
厄介なのが、BOMが有るUTF-8と、無いUTF-8があるのです。
UTF-8にBOMを付けるのは、Windows'メモ帳'やExcelです。
LinuxやMacは基本的にBOM無しUTF-8で扱うようです。
PythonでUTF-8 BOM有りファイルを扱う
今回はExcelで編集したcsvを読み込みたかったので、BOMを考慮しなければいけませんでした。
とおもっていたら、ドキュメントに書いてましたね。
公式ドキュメント BOM 印付き UTF-8
エンコードのコーデックに 'utf_8_sig' とすると、
BOM有りの場合スキップして読み込んでくれます。
BOM無しの場合はそのままUTF-8として読み込むことが可能です。
サンプルプログラム
import io
with io.open('sample.csv', 'rt', encoding='utf_8_sig') as f:
print(f.readlines())
最後に
Pythonで文字コードはハマりがちですが、unicode型に変換するときの文字コードしっかり扱えれば、文字コード関連で悩むことが少なくなりそうです。