[小ネタ] Pandasでto_csv利用時「No such file or directory」エラーとなったときの対処方法

2020.08.23

この記事は公開されてから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を使うときに調べるだろうということで備忘録を兼ねてブログにしてみました。

同じエラーに遭遇した方のお役に立てれば幸いです。

参考サイト

https://stackoverflow.com/questions/47143836/pandas-dataframe-to-csv-raising-ioerror-no-such-file-or-directory