Python3では、ファイルを扱う際のデフォルトの文字エンコーディングはOSに依存します。Unix (Linux)系では、locale (LC_CTYPE)
に依存します。何も考えずにファイルの読み書きをすると、環境によってはUnicodeDecodeError
などに遭遇する可能性があります。
例えば、日本語が書かれたutf-8のテキストファイルがあるとします。このファイルを開いて中身を取得するコードは以下の通りです。
with open('utf-8.txt', mode='r') as fp:
text = fp.read()
特にエラーもなく開いてファイルの中身を取得できます。これはmacOSが文字エンコーディングがデフォルトでUTF-8だからです。
実際に利用される文字エンコーディングはlocale.getpreferredencoding
で確認できます。
import locale
locale.getpreferredencoding() # UTF-8
getpreferredencoding
がUTF-8なので、utf-8のテキストがエラーもなく読めます。
しかし、LC_CTYPE
を変えてエラーになるのを確認することもできます。
import locale
locale.setlocale(locale.LC_CTYPE, ('C'))
print(locale.getpreferredencoding(False)) # => US-ASCII になる
with open('hoge.txt') as fp:
text = fp.read() # UnicodeDecodeError
LC_CTYPE
をCに設定したことで、文字エンコーディングがUS-ASCIIになります。その結果、utf-8のテキストをreadする時にUnicodeDecodeError
となります。
このような問題を避けるためには、ファイルを扱う時には、文字エンコーディングを指定するのが良いです。Python3ではopen
がencoding
引数を受け取れるようになったのでそれを利用すれば良いです。
with open('utf-8.txt', encoding='utf-8') as fp:
text = fp.read()
以上がMac上のPythonでUTF-8を扱う方法についての基本的な情報です。この情報が役立つことを願っています。.