[python] pandasでcsvを読み込む際のデコード問題を回避する


■やりたいこと

csvをpandasでデータを読み込もうと思ったら全件読み込めないままエラーも出ずに終了してしまった。
いろいろ調べてみたらデコードできない文字が混在している行が読み込めないようだということがわかった。
試行錯誤の結果、codecsを使えばいいらしい。

■解決策

  • codecsでcsvをopen
  • errorsオプションをignoreにすることでエラーをスルーさせる
  • replaceにすると、エラー箇所が?に置換される

■ライブラリ

  • pandas
  • codecs

■サンプルコード

test

import pandas as pd
import codecs

# 読み込むcsv
target = 'sample.csv'
# 出力先
out = 'output.tsv'

# csvをcodecsでopenする
# エラーは無視する
with codecs.open(target, mode='r', encoding='shift-jis', errors='ignore') as f:
    df = pd.read_csv(
            f,
            sep=',',
            engine='python',    # encodingのかわりにengine='python'にするとおまかせになるらしい
            # 特定のカラムだけ出力したい時はusecolsで設定する
            usecols=[
                'ID',
                'NAME',
                'COMPANYADDRESS__C',
                'CORPORATEADDRESS__C',
                'CORPORATIONNUMBER__C',
                'TDBCOMPANYCODE__C',
                'COUNTRY__C'
            ],
            # 一見数値に見えるカラムの値も文字として扱いたいので文字列にコンバートしておく
            # 何もしないと出力時に小数点以下がついたりするので注意
            converters={
                'ID': str,
                'CORPORATIONNUMBER__C': str,
                'TDBCOMPANYCODE__C': str
                }
    )

    # 出力
    df.to_csv(out, sep='\t',encoding='utf-8',index=False)