Pythonでは、ファイルを操作する際には文字エンコーディングを考慮する必要があります。特に、異なるエンコーディングを持つファイルを読み書きするときには注意が必要です。
Python3では、open
関数でファイルを扱う際のデフォルトの文字エンコーディングはOSに依存します。Unix (Linux)系では、locale (LC_CTYPE)
に依存します。何も考えずにファイルの読み書きをすると、環境によってはUnicodeDecodeError
などに遭遇する可能性があります。
with open('utf-8.txt', mode='r') as fp:
text = fp.read()
上記のコードは、特にエラーもなくファイルの中身を取得できます。しかし、これはmacOSが文字エンコーディングがデフォルトでUTF-8だからです。
実際に利用される文字エンコーディングはlocale.getpreferredencoding
で確認できます。
import locale
locale.getpreferredencoding()
このコードは、getpreferredencoding
がUTF-8なので、utf-8のテキストがエラーもなく読めることを示しています。
しかし、LC_CTYPE
を変更すると、エラーが発生する可能性があります。
import locale
locale.setlocale(locale.LC_CTYPE, ('C'))
with open('hoge.txt') as fp:
text = fp.read()
上記のコードは、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()
このように、Pythonでファイルを扱う際には、文字エンコーディングを意識することが重要です。それにより、意図せぬエラーを避けることができます。.