Python|ファイルの文字コードを変換する

1. はじめに

Pythonでテキストファイルを扱う際、文字化けや読み込みエラーに悩まされたことはありませんか?
この記事では、「Python|ファイルの文字コードを変換する」というテーマで、文字コード変換の基本から応用まで丁寧に解説します。

例えば、Shift_JISで書かれたファイルをUTF-8に変換する、あるいはその逆など、Pythonでは数行のコードで簡単に実現できます。本記事では、初心者でも理解しやすいように、具体的なコードと実行結果を交えて紹介します。

実務でも文字コードの不一致による不具合は頻出するため、この記事を読むことでエンジニアとしての実践力も高まります。

 

2. Pythonでの文字コード変換の基本

2-1. 文字コードとは?

文字コード(エンコーディング)とは、文字をバイト列としてコンピュータに保存・伝達するためのルールです。
代表的な文字コードには以下のようなものがあります:

  • UTF-8:多言語対応の汎用的なエンコーディング。Webでも主流。
  • Shift_JIS:Windows環境や古い日本語ファイルで使用されることが多い。
  • EUC-JP:UNIX環境などでかつてよく使われた。

2-2. Pythonでの文字コード変換の基本構文

Pythonでは、テキストファイルを別の文字コードに変換するには、次のような手順をとります。

  1. 元ファイルを指定されたエンコーディングで読み込む
  2. 読み込んだ内容を別のエンコーディングで新規保存する

以下はShift_JISからUTF-8に変換するシンプルな例です。

# Shift_JIS → UTF-8へ変換する例
input_file = 'input_sjis.txt'
output_file = 'output_utf8.txt'

# Shift_JISで読み込み、UTF-8で書き出す
with open(input_file, 'r', encoding='shift_jis') as f_in:
    content = f_in.read()

with open(output_file, 'w', encoding='utf-8') as f_out:
    f_out.write(content)

実行結果:

output_utf8.txt が UTF-8 で保存されます(内容は同一)

 

3. よくある使い方・応用例

3-1. ディレクトリ内のファイルを一括変換

複数ファイルを一気に変換したいケースも多いです。以下は指定フォルダ内のすべての.txtファイルをShift_JISからUTF-8へ一括変換するコードです。

import os
import glob

input_dir = 'sjis_files'
output_dir = 'utf8_files'
os.makedirs(output_dir, exist_ok=True)

for filepath in glob.glob(os.path.join(input_dir, '*.txt')):
    filename = os.path.basename(filepath)
    output_path = os.path.join(output_dir, filename)
    
    with open(filepath, 'r', encoding='shift_jis') as f_in:
        content = f_in.read()
    
    with open(output_path, 'w', encoding='utf-8') as f_out:
        f_out.write(content)

実行結果:

sjis_files/内の.txtファイルがすべてutf8_files/にUTF-8で保存される

3-2. chardetでエンコーディングを自動判定して変換

文字コードが不明なファイルを扱う場合は、chardetライブラリが便利です。以下は自動判定してUTF-8に変換する例です。

※chardetのインストールが必要です:pip install chardet

import chardet

input_file = 'unknown_encoding.txt'
output_file = 'converted_utf8.txt'

# バイナリで読み込んでエンコーディングを判定
with open(input_file, 'rb') as f:
    raw_data = f.read()
    result = chardet.detect(raw_data)
    detected_encoding = result['encoding']

# 判定されたエンコーディングでデコードして保存
text = raw_data.decode(detected_encoding)

with open(output_file, 'w', encoding='utf-8') as f_out:
    f_out.write(text)

実行結果:

unknown_encoding.txt の文字コードが自動判定され、UTF-8で保存されます

 

4. 注意点・エラー対策

4-1. UnicodeDecodeErrorの対処

指定した文字コードと実際のファイルのエンコーディングが異なる場合、UnicodeDecodeErrorが発生します。

このエラーを防ぐには:

  • 事前にchardetでエンコーディングを推定する
  • try-exceptでエラーハンドリングする

4-2. 保存時の文字化け対策

変換後のファイルを別のアプリで開いたときに文字化けする場合、対象アプリがUTF-8を正しく認識していない可能性があります。その場合はBOM付きUTF-8で保存する方法もあります。

# BOM付きUTF-8で保存する例
with open('output_bom_utf8.txt', 'w', encoding='utf-8-sig') as f:
    f.write(content)

実行結果:

output_bom_utf8.txt が BOM付きUTF-8 で保存されます

 

5. まとめ

本記事では「Python|ファイルの文字コードを変換する」というテーマで、基本の使い方から応用例、注意点まで解説しました。

  • Pythonでは簡単に文字コード変換ができる
  • 大量ファイルの一括変換や自動判定も可能
  • 文字化け対策やエラー回避の方法も知っておくと安心

文字コードの違いは地味ながらトラブルの元になることが多いです。今回紹介した方法を使えば、実務でも学習でもスムーズに対応できるでしょう。

ちょっとした文字コードの変換ができるだけで、扱えるデータの幅がぐっと広がります。 ぜひ習得しておきたい基本テクニックのひとつです。

タイトルとURLをコピーしました