LoginSignup
45

PythonでUTF-8 with BOMを開く

Last updated at Posted at 2014-03-28

はじめに結論から

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として読み込むことが可能です。

サンプルプログラム

ImportCSV.py

import io

with io.open('sample.csv', 'rt', encoding='utf_8_sig') as f:
    print(f.readlines())

最後に

Pythonで文字コードはハマりがちですが、unicode型に変換するときの文字コードしっかり扱えれば、文字コード関連で悩むことが少なくなりそうです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45