FileNotFoundError: [Errno 2] No such file or directory: 'data/users.csv' は、指定したパスにファイルが無いときのエラーです。 ファイルが確かにあるのに出る場合、多くは 「どこから見たパスか(カレントディレクトリ)」がずれています。

原因 確かめ方 直し方
実行した場所(カレントディレクトリ)が違う print(os.getcwd()) Path(__file__).resolve().parent を基準にする
ファイル名が少し違う(拡張子・全角スペース・大文字小文字) print(os.listdir("data")) 一覧に表示された名前に合わせる
Windows のパスの \n・\t が別の文字に変わった エラー文のパスに \n が見える r"C:\..." で書く
書き込み先のフォルダが無い open(..., "w") で出る 先にフォルダを作る

確認環境:Python 3.14(Linux)。フォルダの構成とファイルを作って再現しました(確認日 2026年10月11日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「FileNotFoundError: [Errno 2]の直し方|Python」

同じコードが、実行した場所で動いたり止まったりする

次の構成で試しました。

proj/
└── app/
    ├── main.py
    └── data/
        └── users.csv
# app/main.py
import os
print("cwd:", os.getcwd())
with open("data/users.csv", encoding="utf-8") as f:
    print(f.readline().strip())
実行した場所 コマンド 結果
proj/app python main.py 動いた(id,name と表示)
proj python app/main.py FileNotFoundError
/(別の場所) python /…/proj/app/main.py FileNotFoundError
cwd: /srv/s4/p9/proj
Traceback (most recent call last):
  File "/srv/s4/p9/proj/app/main.py", line 3, in <module>
    with open("data/users.csv", encoding="utf-8") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'data/users.csv'

"data/users.csv" のような相対パスは、main.py の場所ではなく、カレントディレクトリ(os.getcwd() で表示される場所)から探されます。 pathlib の公式ドキュメントでも、相対パスはカレントディレクトリを基準に解釈されると説明されています。

直し方:スクリプトの場所を基準にする

from pathlib import Path

BASE = Path(__file__).resolve().parent          # main.py があるフォルダ
with open(BASE / "data" / "users.csv", encoding="utf-8") as f:
    print(f.readline().strip())
実行した場所 結果
proj/app 動いた
proj 動いた
/ 動いた(BASE = /srv/s4/p9/proj/app)

__file__ は、実行しているスクリプトのパスです。 .resolve().parent でそのフォルダの絶対パスになるので、どこから実行しても同じファイルを開けます。プロジェクトの一番上のフォルダを基準にしたいときは、.parent.parent のようにたどります。

どこから実行されているかで、カレントディレクトリが変わる

実行のしかた カレントディレクトリ
ターミナルで python main.py コマンドを打ったフォルダ
VS Code の「Python ファイルの実行」 開いているフォルダ(ワークスペース)。設定 python.terminal.executeInFileDir を true にすると、ファイルのフォルダ(既定は false)
cron・タスクスケジューラ スクリプトの場所と同じとは限らない

「VS Code で動いたのに、タスクスケジューラで動かすと止まる」は、この違いが原因のことがあります。 定期実行するスクリプトは、最初から Path(__file__) を基準にしておくと安心です。

ファイル名が少し違う(全角スペース・拡張子・大文字小文字)

data フォルダに 売上 2024.csv(全角スペース)と report.csv.txt を置いて試しました。

開こうとした名前 実際のファイル名 結果
売上 2024.csv(半角スペース) 売上 2024.csv(全角スペース) FileNotFoundError
report.csv report.csv.txt(拡張子が二重) FileNotFoundError
Users.csv users.csv(大文字小文字が違う) FileNotFoundError(Linux)

Windows のエクスプローラーは、既定で拡張子を表示しない設定のことがあり、report.csv.txt が report.csv に見えます。 フォルダの中身を Python で一覧にすると、本当の名前が分かります。

import os
print(os.listdir("data"))
# ['users.csv', 'report.csv.txt', '売上\u30002024.csv']

print で表示される一覧では、全角スペースが \u3000 と表示されました。 見た目で区別しにくい文字も、ここで分かります。大文字小文字は、Linux では区別されます。Windows と Mac では既定で区別しないことが多いため、手元で動いたのに Linux のサーバーで止まることがあります。

似たエラーとの違い

エラー 意味 再現した例
FileNotFoundError: [Errno 2] ファイル(または途中のフォルダ)が無い open("data/nouser.csv")
FileNotFoundError(書き込み) 書き込み先のフォルダが無い open("nodir/out.txt", "w")
IsADirectoryError: [Errno 21] フォルダを開こうとした open("data")
NotADirectoryError: [Errno 20] パスの途中がファイル open("data/users.csv/x")

書き込み("w")でも FileNotFoundError になります。 ファイルは自動で作られますが、フォルダは作られないためです。

from pathlib import Path
out = Path("nodir/out.txt")
out.parent.mkdir(parents=True, exist_ok=True)     # フォルダを先に作る
out.write_text("ok", encoding="utf-8")

Windows のパスが壊れているとき

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\data\new\test.csv'

エラー文のパスの中に、\\ でなく1本の \ の \n・\t が見えたら、文字列の中で改行・タブに変わっています。 r"C:\data\new\test.csv" のように、文字列の前に r を付けます。詳しくは関連記事の「unicodeescapeエラーの直し方|Windowsのパス」で扱っています。

確認の手順(チェックリスト)

順番 確認すること 方法
1 カレントディレクトリはどこか print(os.getcwd())
2 実際に探している絶対パス print(Path("data/users.csv").resolve())
3 そのフォルダに何があるか print(os.listdir(フォルダ))
4 名前が一致するか 拡張子・全角スペース・大文字小文字
5 Windows のパスが壊れていないか \n・\t が見えたら r"..."
6 書き込みならフォルダがあるか mkdir(parents=True, exist_ok=True)

2番の resolve() で表示されるパスが、ファイルがあると思っている場所と違えば、カレントディレクトリが原因です。

よくある質問

Q. Java の FileNotFoundException も同じ原因ですか。 A. 相対パスがカレントディレクトリから探される点は同じです。既存の記事「Java FileNotFoundExceptionの原因と対処|相対パス早見表」で扱っています。

Q. os.chdir() でカレントディレクトリを変えるのはどうですか。 A. 動きますが、プログラム全体のカレントディレクトリが変わり、ほかの相対パスにも影響します。ファイルを開く部分だけ Path(__file__) を基準にするほうが、影響が小さく済みます。

まとめ

  • 相対パスは、スクリプトの場所ではなく、カレントディレクトリから探される
  • Path(__file__).resolve().parent を基準にすると、どこから実行しても動く
  • VS Code・タスクスケジューラ・cron でカレントディレクトリが変わる
  • os.listdir() で本当のファイル名を確かめる(拡張子・全角スペース・大文字小文字)
  • 書き込みでもフォルダが無いと FileNotFoundError

参考・出典

確認日はいずれも 2026年10月11日です。

  • Python ドキュメント「pathlib」:https://docs.python.org/3/library/pathlib.html
  • Visual Studio Code「Python settings reference」(python.terminal.executeInFileDir):https://code.visualstudio.com/docs/python/settings-reference

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「FileNotFoundError: [Errno 2]の直し方|Python」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?