[解決!Python]エンコーディングを指定して、シフトJISなどのファイルを読み書きするには:解決!Python
open関数のencodingパラメーターでテキストファイルのエンコーディング方式を明示して、デフォルトエンコーディング以外の形式で符号化されているファイルを読み書きする方法を紹介する。
* 本稿は2021年4月27日に公開された記事をPython 3.12.4で動作確認したものです(確認日:2024年7月10日)。
# シフト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のテキストファイルを読み込もうとするとやはり例外が発生する。以下はその例だ。
このように、手元のマシンとは別のマシンで作成されたテキストファイルが自分が普段使っているのとは異なるエンコーディングになっていることはよくある。オープンしようとしているテキストファイルのエンコーディングが分かっていれば、open関数のencodingパラメーターで、それを明示することで、デフォルトのエンコーディングとは異なる形式のテキストファイルも読み込めるようになる。
例えば、テキストファイルを読み込む際に、それがシフトJISでエンコードされていることを明示するには次のようにする。
with open('sjis.txt', encoding='shift_jis') as f:
s = f.read()
print(s.strip())
これをmacOS上で実行した結果を以下に示す。
同様にUTF-8エンコードされていることを明示して、ファイルをオープンするには次のようにする。
with open('utf8.txt', encoding='utf-8') as f:
s = f.read()
print(s.strip())
これをWindowsで実行した結果を以下に示す。
あるいはテキストファイルを「バイナリファイル」としてオープンした後に、エンコーディングを指定してデコードする方法もある。以下に例を示す。
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())
Copyright© Digital Advantage Corp. All Rights Reserved.