Kedroのcsv書き出しの文字コード
目的
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"
ディスカッション
コメント一覧
まだ、コメントがありません