shikoan’s memo

プログラミング初心者のチラ裏

ぷろぐらみんぐ帳

CentOS7+Python3.xで日本語を内容に含むファイル出力をしたときにUnicodeEncodeErrorがでたときの対策

環境:CentOS7、Python3.6

Windows環境では発生しなかったのにLinux環境で実行したら発生した。

test.py

with open("hoge.txt", "w") as fp:
    fp.write(u"あああああいいいいうううう日本語")
Traceback (most recent call last):
  File "test.py", line 2, in <module>
    fp.write(u"\u3042\u3042\u3042\u3042\u3042\u3044\u3044\u3044\u3044\u3046\u3046\u3046\u3046\u65e5\u672c\u8a9e")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-15: ordinal not in range(128)

【原因】OSのデフォルトエンコードANSIだった。公式ドキュメントにあった。open()関数のドキュメントより。

2. 組み込み関数 — Python 3.6.4 ドキュメント

encoding はファイルのエンコードやデコードに使われる text encoding の名前です。このオプションはテキストモードでのみ使用してください。デフォルトエンコーディングはプラットフォーム依存 (locale.getpreferredencoding() が返すもの) ですが、Pythonでサポートされているエンコーディングはどれでも使えます。詳しくは codecs モジュール内のサポートしているエンコーディングのリストを参照してください。

locale.getpreferredencoding() を確認してみる。

[*****]$ python3.6
Python 3.6.4 (default, Dec 19 2017, 14:48:12)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getpreferredencoding()
'ANSI_X3.4-1968'

つまり、openの際にエンコードを"utf-8"と指定してやる必要がある。

with open("hoge.txt", "w", encoding="utf-8") as fp:
    fp.write(u"あああああいいいいうううう日本語")

無事、保存することができた。(別にu””はつけてもつけなくてもOK)