連載
» 2021年04月27日 05時00分 公開

[解決!Python]エンコーディングを指定して、シフトJISなどのファイルを読み書きするには解決!Python

open関数のencodingパラメーターでテキストファイルのエンコーディング方式を明示して、デフォルトエンコーディング以外の形式で符号化されているファイルを読み書きする方法を紹介する。

[かわさきしんじ,Deep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

# シフトJISエンコードのテキストファイルの読み込み
with open('sjis.txt', encoding='shift_jis') as f:
    s = f.read()

print(s.rstrip())  # このファイルはシフトJISでエンコードされています

# UTF8エンコードのテキストファイルの読み込み
with open('utf8.txt', encoding='utf-8') as f:
    s = f.read()

print(s.rstrip())  # このファイルはUTF-8でエンコードされています

# バイナリファイルとして読み込んだ後にエンコーディングを指定してデコード
with open('sjis.txt', 'rb') as f:
    b = f.read()

s = b.decode('shift_jis')
print(s.rstrip())  # このファイルはシフトJISでエンコードされています

# シフトJISエンコードでテキストファイルに書き込み
with open('sjis-2.txt', 'w', encoding='shift_jis') as f:
    f.write('このファイルもシフトJISでエンコードされています\n')

with open('sjis-2.txt', encoding='shift_jis') as f:
    print(f.read().rstrip())

# UTF-8エンコードでテキストファイルに書き込み
with open('utf8-2.txt', 'w', encoding='utf-8') as f:
    f.write('このファイルもUTF-8でエンコードされています\n')

with open('utf8-2.txt', encoding='utf-8') as f:
    print(f.read().rstrip())


open関数とエンコーディング

 Pythonのopen関数でテキストファイルをオープンする場合、特に指定をしない限り、コードを実行しようとしているプラットフォームごとに定められているエンコーディングを使って、そのファイルがオープンされる。例えば、macOSならテキストファイルがUTF-8でエンコードされていると見なされ、Windows(日本語版)ならCP932(≒シフトJIS)でエンコードされていると見なされる。

 そのため、macOSからPythonでシフトJISのテキストファイルを読み込もうとすると例外が発生するし、Windows(日本語版)からPythonでUTF-8のテキストファイルを読み込もうとするとやはり例外が発生する。以下はその例だ。

macOSではシフトJISエンコードのテキストファイルを読み込めない
WindowsではUTF-8エンコードのテキストファイルを読み込めない デフォルトのエンコーディングだと、macOSではシフトJISエンコードのテキストファイルを読み込めず、WindowsではUTF-8エンコードのテキストファイルを読み込めない

 このように、手元のマシンとは別のマシンで作成されたテキストファイルが自分が普段使っているのとは異なるエンコーディングになっていることはよくある。オープンしようとしているテキストファイルのエンコーディングが分かっていれば、open関数のencodingパラメーターで、それを明示することで、デフォルトのエンコーディングとは異なる形式のテキストファイルも読み込めるようになる。

 例えば、テキストファイルを読み込む際に、それがシフトJISでエンコードされていることを明示するには次のようにする。

with open('sjis.txt', encoding='shift_jis') as f:
    s = f.read()

print(s.strip())


 これをmacOS上で実行した結果を以下に示す。

macOSからシフトJISエンコーディングのテキストファイルをオープンできた macOSからシフトJISエンコーディングのテキストファイルをオープンできた

 同様にUTF-8エンコードされていることを明示して、ファイルをオープンするには次のようにする。

with open('utf8.txt', encoding='utf-8') as f:
    s = f.read()

print(s.strip())


 これをWindowsで実行した結果を以下に示す。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。