Kedroのcsv書き出しの文字コード

2022年3月4日

目的

Kedroで文字コード指定して、ファイルに書き出す方法について備忘録として残す。

事象

Kedroでcsvをsaveするときに、指定した文字コードで保存されなかった。

yamlを設定は公式ドキュメントに沿って、feature_datasetをUTF-8で保存するようした。
https://kedro.readthedocs.io/en/stable/05_data/01_data_catalog.html

titanic:
  type: pandas.CSVDataSet
  filepath: data/01_raw/titanic_train.csv

feature_dataset:
  type: pandas.CSVDataSet
  filepath: data/04_feature/features.csv
  save_args:
    index: False
    encoding: "utf-8"

以下が実行したコード
Titanicのデータを読み込んで、
Sexカラムを性別カラムに変更して、feature_datasetに保存する。

from kedro.io import DataCatalog
import yaml
import os

with open(os.path.join('conf', 'base', 'catalog.yml'), 'r') as f:
    config = yaml.load(f, Loader=yaml.FullLoader)

# DataCatalogを用意
catalog = DataCatalog.from_config(config)

df = catalog.load('titanic')
features = df[['Pclass', 'Name', 'Sex', 'Age', 'SibSp',
               'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked']]

# 日本語のカラム追加
features.loc[df['Sex']=='male', '性別'] = '男'
features.loc[df['Sex']=='female', '性別'] = '女'

catalog.save('feature_dataset', features)
print(features['性別'].unique())

df = catalog.load('feature_dataset')
print(df['性別'].unique())

実行するとエラーが発生
feature_datasetの文字コードが UTF-8ではないので読み込めないようだ。
data/04_feature/features.csvを確認するとShift JISで保存されていた。

Traceback (most recent call last):
  File "src/test_kedro/kedro_test.py", line 22, in <module>
    df = catalog.load('feature_dataset')
  File "D:\Documents\git\sandbox\sandbox\lib\site-packages\kedro\io\data_catalog.py", line 397, in load
    result = func()
  File "D:\Documents\git\sandbox\sandbox\lib\site-packages\kedro\io\core.py", line 595, in load
    return super().load()
  File "D:\Documents\git\sandbox\sandbox\lib\site-packages\kedro\io\core.py", line 191, in load
    raise DataSetError(message) from exc
kedro.io.core.DataSetError: Failed while loading data from data set CSVDataSet(filepath=data/04_feature/features.csv, load_args={}, protocol=file, save_args={'encoding': utf-8, 'index': False}).
'utf-8' codec can't decode byte 0x90 in position 59: invalid start byte

解決策

ググって有用な情報を見つけた。
https://kedro.readthedocs.io/en/stable/05_data/01_data_catalog.html

yamlのfs_specパラメタで文字コードを設定するとよいらしい。
下記のように修正するとうまく動いた。

feature_dataset:
  type: pandas.CSVDataSet
  filepath: data/04_feature/features.csv
  fs_args:
    open_args_save:
      encoding: "utf-8"