Posted at

UnicodeEncodeDecodeError: BOMありUTF-8ファイルの読み込み


問題

Pythonでテキストファイルを読み込むために以下のコードを実行した.


readtext.py

f = open('test.txt','r',encoding='utf-8')

line = f.readline()
print(line)

そしたら,UnicodeEncodeDecodeErrorが出ました.


UnicodeEncodeDecodeError

"'cp932' codec can't encode character '\ufeff' ..."


解決したのでメモしておきます.


諸条件

OS: Windows10 Pro

IDE: PyCharm Community 2019.1

Env: Anaconda3

その他:テキストファイルはWindowsのエディタで作成


原因

\ufeffはUTF-8テキストの開始を表す文字列だそうで,cp932(Windowsの標準入出力文字コード)にはないので,エンコーダーが困ってしまっちゃったようです.よしよし.

ちなみにこのエンコーダーは,unicode文字列をwindowsに書き出したりするときに自動でcp932に変換してくれるらしいです.親切が裏目にでちゃったんだね.よしよし.


解決策

ファイルを開く時に,\ufeff付きのUTF-8テキストであることを教えてあげるとうまくいきました.ちなみに\ufeff付きのファイルをBOMありUTF-8っていうらしいです.


readtext2.py

f = open('text.txt','r',encoding='utf-u-sig') # BOMありUTF-8

line = f.readline()
print(line)

めでたしめでたし.


その他

以下の情報のおかげで無事に問題を解決することができました.どうもありがとうございます.


  1. (Windows) Python3でのUnicodeEncodeErrorの原因と回避方法

  2. \ufeffって???