Pythonでファイルのエンコーディングを指定して読み書き
この記事では、Pythonでファイルを読み書きする際にエンコーディングを指定する方法を説明します。様々なエンコーディング(UTF-8、Shift-JISなど)を扱うためのテクニックを学び、文字化けを防ぐ方法を習得します。
目次
エンコーディングとは?
エンコーディングとは、文字をコンピュータで扱うための符号化方式のことです。文字コードとも呼ばれます。Pythonでは、ファイルを読み書きする際に適切なエンコーディングを指定することで、文字化けを防ぐことができます。代表的なエンコーディングとして、UTF-8、Shift-JISなどがあります。
UTF-8は、世界中の多くの文字を扱えるように設計された、広く使われているエンコーディングです。Shift-JISは、日本語を扱うためのエンコーディングです。
ファイルの読み込み
open()関数でファイルを指定し、encoding引数にエンコーディングを指定して読み込みます。
with open('sample.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
encoding='utf-8'の部分でUTF-8で読み込みます。Shift-JISの場合は'shift_jis'と指定します。
エラーハンドリングについては後述します。
ファイルの書き込み
open()関数でファイルを指定し、encoding引数にエンコーディングを指定して書き込みます。
with open('output.txt', 'w', encoding='utf-8') as f:
f.write('こんにちは、世界!')
encoding='utf-8'の部分でUTF-8で書き込みます。Shift-JISの場合は'shift_jis'と指定します。
書き込みに失敗した場合のエラーハンドリングについては後述します。
様々なエンコーディングへの対応
ファイルのエンコーディングが不明な場合は、chardetライブラリを使って自動的に検出することができます。
import chardet
with open('unknown_encoding.txt', 'rb') as f:
rawdata = f.read()
result = chardet.detect(rawdata)
encoding = result['encoding']
with open('unknown_encoding.txt', 'r', encoding=encoding) as f:
content = f.read()
print(content)
chardet.detect()は、ファイルのエンコーディングを推測し、辞書形式で結果を返します。'encoding'キーにエンコーディング名が入っています。
エラーハンドリング
ファイルを開く際、エンコーディングが間違っているなど、様々なエラーが発生する可能性があります。try-exceptブロックを使用してエラーを適切に処理しましょう。
try:
with open('sample.txt', 'r', encoding='utf-8') as f:
content = f.read()
except FileNotFoundError:
print('ファイルが見つかりません')
except UnicodeDecodeError:
print('エンコーディングが不正です')
except Exception as e:
print(f'エラーが発生しました: {e}')
実践例
Shift-JISで記述されたファイルを読み込み、UTF-8で書き出す例
try:
with open('sample_shiftjis.txt', 'r', encoding='shift_jis') as fin:
content = fin.read()
with open('output_utf8.txt', 'w', encoding='utf-8') as fout:
fout.write(content)
except FileNotFoundError:
print('ファイルが見つかりません')
except UnicodeDecodeError:
print('エンコーディングが不正です')
except Exception as e:
print(f'エラーが発生しました: {e}')
サンプルファイル(sample_shiftjis.txt)を用意し、実行してみてください。出力ファイル(output_utf8.txt)が生成されます。
関連記事
- Pythonでファイルに書き込む(write, writelines)
- Pythonでファイルを開く・閉じる(open, close)
- Pythonでファイルを読み込む(read, readline, readlines)
- Pythonでファイルを追記モードで開く
- Pythonでファイルの上書き・削除
- Pythonでファイル・ディレクトリの存在確認(os.path.exists, os.path.isfile, os.path.isdir)
- Pythonでファイルをバイナリモードで読み書き
- PythonでCSVファイルを読み書き(csv)
- PythonでJSONファイルを読み書き(json)
- Pythonでpickleを使ってオブジェクトをシリアライズ・デシリアライズ