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

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

» 2024年03月01日 05時00分 公開
[かわさきしんじDeep Insider編集部]
「解決!Python」のインデックス

連載目次

* 本稿は2021年4月27日に公開された記事をPython 3.12.2で動作確認したものです(確認日:2024年3月1日)。


# シフト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で実行した結果を以下に示す。

WindowsからUTF-8エンコーディングのテキストファイルをオープンできた WindowsからUTF-8エンコーディングのテキストファイルをオープンできた

 あるいはテキストファイルを「バイナリファイル」としてオープンした後に、エンコーディングを指定してデコードする方法もある。以下に例を示す。

with open('sjis.txt', 'rb') as f:
    b = f.read()

s = b.decode('shift_jis')
print(s.rstrip())


 encodingパラメーターに指定できる値については「標準エンコーディング」を参照のこと。以下には一部を抜粋する(ハイフンの代わりにアンダースコア、またはその逆を記述可能。大文字小文字の区別はない)。

名前 別名
cp932 932、ms932、mskanji、ms-kanji
euc_jp eucjp、ujis、u-jis
iso2022_jp csiso2022jp、iso2022jp、iso-2022-jp
shift_jis csshiftjis、shiftjis、sjis、s_jis
utf_32 U32、utf32
utf_16 U16、utf16
utf_8 U8、UTF、utf8、cp65001
open関数でエンコーディングに指定可能な値(一部)

 ファイルに書き込む場合も同様だ。以下に例を示す(実行結果は省略)。

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())

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())


 ただし、ファイルを追記するようなときには、必ずテキストファイルを適切なエンコーディングでオープンするようにしよう。以下のようなコードは実行でき、ファイルを壊す。

# UTF-8エンコーディングのテキストファイルにシフトJISで追記
with open('utf8-2.txt', 'a', encoding='shift_jis') as f:
    f.write('シフトJIS\n')

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


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

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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