この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
どうも!大阪オフィスの西村祐二です
最近、CSVを扱うためにPandasを利用する機会がありました。
Pandasには便利な関数が多くあり、特にCSV形式で出力したいときにto_csv
関数はよく使う関数です。
今回、to_csv
関数を使うにあたって遭遇したエラーと対処法を備忘録を兼ねてブログにまとめておきます。
環境
- Python: 3.8.5
- Pandas: 1.1.0
遭遇したエラー:出力先のディレクトリが存在しないとき「No such file or directory」となる
to_csv
は指定した出力先にファイルが存在しない場合はそのファイルを作成しますが、ディレクトリが存在しないときは作成されず、エラーとなります。
# エラーにならない
df.to_csv('/tmp/hoge.csv')
# testというディレクトリがないとエラーになる
df.to_csv('/tmp/test/hoge.csv')
対処方法
to_csv
のオプションで回避できるか探したのですが該当するオプションが見あたらなかったため、
事前にディレクトリを作成する処理を挟むことで対処します。
pythonにはpathlib
モジュールという便利なモジュールがあるのでこちらを利用します。
下記にサンプルを載せておきます。
下記は/tmp/test/hoge.csv
にdataframeをcsv形式で出力するサンプルプログラムです。
import pandas as pd
from pathlib import Path
def func(output_dir, output_file_name):
df = pd.DataFrame({'name': ['Raphael', 'Donatello'],
'mask': ['red', 'purple'],
'weapon': ['sai', 'bo staff']})
# ディレクトリがないとエラーになるため作成
dir = Path(output_dir)
dir.mkdir(parents=True, exist_ok=True)
# csv形式で出力
df.to_csv(f'{output_dir}/{output_file_name}')
if __name__ == '__main__':
func('/tmp/test', 'hoge.csv')
ポイントを簡単に説明すると
parents = True
を設定すると、必要な親ディレクトリも作成されますexist_ok= True
は、ディレクトリがすでに存在する場合でもエラーを発生させないための設定です
さいごに
また、to_csv
を使うときに調べるだろうということで備忘録を兼ねてブログにしてみました。
同じエラーに遭遇した方のお役に立てれば幸いです。