PythonでツイッターのAPIを用いてツイートデータをスクレイピングして形態素解析を行っていたところ以下のようなエラーに遭遇しました。
<作業環境>
- Windows10
- Jupyterlab
- Python3.7
<エラー内容>
cp932 codec can't encode character '\u014d'in position6: ilegal multibyte sequence
内容としてはCP932(日本語のエンコード方式)ではエンコードできない文字があるよって感じです。まあこの時に扱っていたデータはTwitterのツイートデータなので、絵文字とか特殊文字とかがひっかかっているのだと思われます。解決方法としては、エンコードの際の文字コードをutf-8に指定する、エラーを無視するの2通りが存在します。
テキスト出力時の処理
Pythonだと文字列データなどを writer.writerow(
とかで書き出すわけですが、Pythonでtxtやcsvファイルに書き出す時には Python の内部表現をそのまま書き出すわけにはいきませんので、何らかの文字コードでエンコードし、バイト列にしてから書いてやることになります。
この時 Python 3 はデフォルトの文字コードとして 実行している OS の言語環境の文字コード を選択してしまいます。そして日本語の Windows では、その文字コードは CP932 と呼ばれるものになっています。
CP932 は Shift_JIS とは若干異なりますが日本語の文字コード一種です、 CP932 は日本語用の文字コードなので、英語でよく使われるUnicode文字をエンコードしようとするとエンコードエラーを起こします。
こういった場合の対処法として恐らく一番良いのはエラーの対象になっている文字をきちんと表現できる文字コードを指定することで、open()
関数に encoding='utf-8'
というキーワード引数を加えることで解決します。
またエラーを無視するのも策の1つでOpen関数にerrors='ignore'
というキーワード引数を加えることでも解決します。
例
with open('test.csv', 'wb',encoding='utf-8', errors='ignore') as f: f.write(['2021-11-01', 'テスト', 'こんにちは'])
他にもPandasでcsvを読み込んだり出力した際にも文字コードの「UnicodeDecodeError」が発生することがあります。
関連記事:【Python】pandasのcsv読み込みで「UnicodeDecodeError」が出たときの解決方法一覧
終わり
MACやLinuxがUTF-8であるのに対して、日本で発売されているWindowsの文字コードはCP932なので、同じコードでもMACやLINUX環境で書かれた内部でエンコードで行っている系のプログラムをそのままコピペして実行しようとすると文字コードの関係でエラーになることがあるので注意しましょう。
コメント
[…] 関連記事:ファイル書き出し時に「cp932 codec can’t encode character」エラーが出る際の解決法 […]