PYTHON MEBY

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)が生成されます。

関連記事