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ではopenencoding引数を受け取れるようになったのでそれを利用すれば良いです。

with open('utf-8.txt', encoding='utf-8') as fp:
    text = fp.read()

以上がMac上のPythonでUTF-8を扱う方法についての基本的な情報です。この情報が役立つことを願っています。.

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です