Pocket

読了時間:20分

みなさん、こんにちは!

初学者チュートリアルとして今回は、PandasにおけるCSVファイル読み込みの「文字コード指定」についてご紹介します。

はじめに

みなさんは、「文字化け」の経験はありませんか?

文字化けはデータ処理をする人が誰でも突き当たる壁です。これは、コード作成者が指定する「文字コード」とデータの「文字コード」が異なることによって起こります。

文字コードって?文字化けって?

文字コードとは、コンピュータで文字を扱うために各文字に割り当てられる「バイト表現」、あるいはその対応関係のことです。コンピュータはこの対応関係を頼りにデータを「エンコード」(普通の文字を機械語に直す)したり、「デコード」(機械語を普通の文字に戻す)したりします。

この対応関係の指定を私たちが間違えてしまうと、上で示した図のような「文字化け」が起こります。

文字コードには様々ありますが、以下では頻出の「Shift-JIS」(日本語ファイル、国勢調査などのオフィシャルなデータによくある)と「UTF-8」(ほぼ国際標準と考えて差支えない)に絞ってご紹介します。

文字化けを回避する方法

このような事態を避けるためには、何よりも私たちがデータの読み込み・書き込みの際に正しい文字コードを指定することが一番です。

読み取りと書き出し

CSVファイルの読み取り

pd.read_csv(r"file/to/path/file.csv")

や、書き込みの

df.to_csv(r"out/put/path/output.csv")

は皆さんご存知かと思います。

このときにこちらが何も指定しないと、CSVファイルをUTF-8で読み込みます。ですから、CSVファイルをShift-JISで読み書きしたいときには、引数で指定する必要があります。

たとえば、以下のようにしてください。

pd.read_csv(r"file/to/path/file.csv", encoding = "shift-jis")

df.to_csv(r"out/put/path/output.csv", encoding = "shift-jis")

それでもなお残るエラー

以上のように指定しても、以下のようなエラーに突き当たることがあります。

UnicodeEncodeError: 'shift_jisx' codec can't encode character '\u9ad9' in position 3: illegal multibyte sequence

これは、

「データ内に、指定した文字コードでは対応していない文字がある。」

というコンピュータからのエラーメッセージです。特に記号や日本語の旧字体がデータにあるときによく起こります。

このような場合は、「codecsモジュール」というモジュール(Python内の道具、Pandasの仲間)を用いましょう。対応していない文字を無視する(なくす)か置き換える(?にする)ことができます。

詳細はこちらcodecsの公式ライブラリ、またこちらの質問内容を参照して下さい。

使い方
  1. コードの初めにimport codecsでモジュールを呼び出してください。
  2. openとコードにありますが、読み込みでも書き込みでも使うことができます。
  3. 引数に”ignore”とすると文字を無視できますし、”replace”としますと置き換えられます。

以下のまとめ

 

読み取り 書き出し
メソッド pd.read_csv df.to_csv
デフォルトのencode None UTF-8
Shift-JISへの直し方 引数に(encoding=”shift_jis”)と指定 引数に(encoding=”shift_jis”)と指定
Shift-JISへ直せない文字への対処 codecsモジュールを使う codecsモジュールを使う
その他1 encoding指定の代わりに引数に(engine = “python”)と指定すれば、UnicodeErrorなしで読み込んでくれる。
その他2 パスの冒頭にrを入れ、パスがescapeシークエンスになることを防ぐ 同左

 

いかがでしたか?文字コードとその指定を正しく理解して、早くデータ処理に取り掛かりましょう!!!

執筆者:宮本