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)