読了時間: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の公式ライブラリ、またこちらの質問内容を参照して下さい。
使い方
- コードの初めに
import codecs
でモジュールを呼び出してください。 - openとコードにありますが、読み込みでも書き込みでも使うことができます。
- 引数に”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シークエンスになることを防ぐ | 同左 |
いかがでしたか?文字コードとその指定を正しく理解して、早くデータ処理に取り掛かりましょう!!!
執筆者:宮本