コース一覧
    Pythonエラー・データ形式
    文字コード

    Pythonエラー・データ形式

    例外処理とデータ形式を深め、異なる入力を検証し変換する処理を設計できるようにします。

    1
    エラー処理の設計
    01. 例外の階層15分
    02. raiseで例外を投げる15分
    03. カスタム例外15分
    04. finallyとelse15分
    05. assertで前提を守る15分
    06. つくる 入力検証の例外設計20分
    07. 第5章クイズ10分
    2
    ファイルとデータ形式
    01. csvモジュール15分
    02. JSONで保存15分
    03. JSONを読み込む15分
    04. pathlibでパス操作15分
    05. 文字コード15分
    06. つくる JSON保存へ移行20分
    07. 第6章クイズ10分

    文字コード

    このレッスンでできるようになること。encoding を明示して、日本語を含む家計簿データを文字化けさせずに保存できるようになります。

    ここまで open には毎回 encoding="utf-8" を付けてきました。今回はその理由を確かめます。

    ファイルの中身は、突き詰めると 0 と 1 の並び、つまりバイト列です。「コーヒー豆」という文字をどのバイト列に対応させるかという取り決めが文字コード (エンコーディング) です。日本語を書き表す方式は1つではなく、現在の標準である UTF-8 のほかに、日本の業務システムで長く使われてきた Shift_JIS があります。同じ文字でも、方式が違えばバイト列が違います。

    そのため、書いたときと違う方式で読むと文字化けするか、そもそも読めずにエラーになります。表計算ソフトから出した CSV が文字化けするという定番の事故は、ほぼこれです。

    Python

    with open("data.csv", "w", encoding="utf-8") as f:
        f.write("コーヒー豆,980\n")
    
    with open("data.csv", encoding="utf-8") as f:
        print(f.read())

    encoding を省くと、Python はその環境の既定の方式を使います。手元では動いたのにサーバーへ置いたら壊れた、という差が出るのはこのためです。読むときも書くときも必ず encoding を書く、と決めてしまうのが一番安全です。

    バイト列を直接見たいときは、モードに "rb" を付けて開きます。返ってくるのは文字列ではなく bytes です。bytes を文字列に直すのが decode、文字列を bytes に直すのが encode で、どちらも方式の名前を渡します。方式が食い違うと UnicodeDecodeError になります。

    古いシステムに合わせて Shift_JIS で書き出さないといけないこともあります。そのときは encoding="shift_jis" を指定します。方式が変わればバイト数も変わり、UTF-8 の日本語1文字は3バイト、Shift_JIS では2バイトになります。

    要件

    1. text を kakeibo_utf8.csv に encoding="utf-8" で、kakeibo_sjis.csv に encoding="shift_jis" で書く
    2. 両方のファイルをモード "rb" で開いてバイト列として読む
    3. 2つのバイト数を空白区切りで1行に表示する
    4. kakeibo_sjis.csv を encoding="shift_jis" で開いて、中身を strip して表示する
    5. Shift_JIS のバイト列を utf-8 として decode し、UnicodeDecodeError を except で捕まえて「文字コードが違うと読めません」と表示する

    ヒント

    バイト数は len(raw) で数えられます

    "rb" で開いたときは encoding を付けません

    捕まえる例外の名前は UnicodeDecodeError です

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/07

    関連レッスン

    • つくる JSON保存へ移行

      CSV から JSON へデータを移す処理を書きます。

    • 第6章クイズ

      ファイルとデータ形式の理解を確認します。

    • pathlibでパス操作

      Path でパスを安全に組み立て、保存先を整理します。

    • JSONを読み込む

      json.load で保存した構造を読み戻します。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 文字化け送受信側のエンコード不一致による表示崩れ
    • 文字コード文字に番号を割り当てるルール体系
    • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
    main.py
    エディタを読み込んでいます

    メモ

    文字コード

    ⌘S で保存