2023-07-14

Python「UnicodeEncodeError: ‘cp932’ codec can’t encode character」エラーの対処方法

Pythonの記事

Pythonでのスクレイピングでデータを収集している際、ファイルの保存時にUnicodeEncodeErrorが発生しました。
エラーの対処方法をご紹介します。

エラーの原因

スクレイピングでWeb上の情報を収集、ファイルへの書き込み時に発生します。

OS:Windows10
Python:3.11.1

●エラーメッセージ

UnicodeEncodeError: 'cp932' codec can't encode character '\xe9' in position 123: illegal multibyte sequence

エラーの内容ですが、「指定された文字コード【cp932】では【\xe9】という文字を変換できません」というもの。エラーの発生箇所を確認すると、f.write(text)での出力が原因のようです。

Traceback (most recent call last):
  File "c:\Users\xxxxx\Desktop\scraping\list.py", line 42, in <module>
    f.write(text)

実行環境がPython3である場合は、OSの言語環境の文字コードがデフォルトで選択されるところ、Windowsではcp932という文字コードが選択されます。cp932はShift_JISに類似する日本語の文字コードで、Unicode文字をエンコードする際にエンコードエラーを起こしてしまうようです。

スポンサーリンク

エラーの解決方法

ファイルを開く際に、文字コードを明示することでエラーを回避できます。
具体的にはopen()関数の引数に、文字コードを指定するだけです。

# 変更前
with open(file_path, "w") as f:
# 変更後 encoding='utf-8'を追加
with open(file_path, "w", encoding='utf-8') as f:

引数にencoding='utf-8'を指定するだけ。
これで文字コード変換時の不具合が解消されます。

そのほか、errors='ignore'を引数に追記することでも解決可能です。
「エラーを無視する」ということでしょうか。

# 変更後 errors='ignore'を追加
with open(file_path, "w", errors='ignore') as f:

まとめ

今回はファイルを開く際に文字コードを指定するという解決方法をご紹介しましたが、エラーの原因となった文字を削除したり変換するという方法もあるようです。
下記は「エラーの原因となった文字」を空欄と置換することで削除しています。データが一部消えていると考えると、ちょっと強引な気がしますね。

changed_text = text.replace('エラーの原因となった文字', '')

また、エラーの原因となる文字を事前に把握すること、文字ごとに対処するというのは現実的でないと考えます。今回ご紹介したように、文字コードを明示するのがもっともスマートで簡単ではないでしょうか。

特定の環境でしか発生しないので、そもそも普段と違う環境で発生したエラーは予測出来ず焦ってしまいますが、冷静に対応しましょう。