Python os.getcwd()とは?カレントディレクトリを取得する方法

Pythonのos.getcwd()は、プログラムが現在どのフォルダで動いているかを取得する関数です。

「ファイルを開こうとしたらFileNotFoundErrorになる」という問題の多くは、実行位置の勘違いが原因です。os.getcwd()はその確認に使います。


os.getcwd()の基本的な使い方

import os

print(os.getcwd())

実行結果(例):

/Users/user/projects/myapp

cwdはcurrent working directory(現在の作業ディレクトリ)の略です。「カレントディレクトリ」とも呼ばれます。

戻り値は絶対パスの文字列です。

import os

print(type(os.getcwd()))

実行結果:

<class 'str'>

カレントディレクトリは「実行した場所」

ここが最大の誤解ポイントです。カレントディレクトリはPythonファイルが置かれている場所ではありません。

次のような構成を考えます。

/Users/user/projects/
├── run.py
└── data/
    └── input.csv

run.pyの中でos.getcwd()を呼んだとき、結果はどこからコマンドを実行したかで変わります。

実行したコマンド os.getcwd()の結果
cd projects してから python run.py /Users/user/projects
python projects/run.py /Users/user

2つ目の場合、open("data/input.csv")は/Users/user/data/input.csvを探すため見つかりません。


スクリプトの場所を基準にする

「どこから実行されても同じファイルを読みたい」場合は、os.getcwd()ではなく__file__を使います。

import os

# このファイルが置かれているフォルダ
here = os.path.dirname(os.path.abspath(__file__))
csv_path = os.path.join(here, "data", "input.csv")

print(here)
print(csv_path)

実行結果(例):

/Users/user/projects
/Users/user/projects/data/input.csv
基準にしたいもの 使うもの
実行した場所(ユーザーが指定した場所) os.getcwd()
スクリプトの場所(固定したい設定ファイルなど) __file__

設定ファイルやテンプレートは__file__基準、ユーザーが指定する入出力ファイルはgetcwd()基準と考えると整理しやすくなります。

os.path.abspath()については「Python os.path.abspath()とは?絶対パスを取得する方法」をご覧ください。


相対パスはカレントディレクトリが基準

import os

print(os.getcwd())
print(os.path.abspath("data.csv"))

実行結果(例):

/Users/user/projects
/Users/user/projects/data.csv

open("data.csv")のように相対パスを書いたときは、すべてカレントディレクトリからの相対位置として解釈されます。

ファイルが見つからないときは、まず次の2行を入れて確認するのが早道です。

import os

print("現在地:", os.getcwd())
print("中身:", os.listdir())

実行結果(例):

現在地: /Users/user
中身: ['Desktop', 'Documents', 'projects']

探しているファイルが一覧にないなら、実行位置が想定と違うと判断できます。

os.listdir()については「Python os.listdir()とは?ファイル一覧を取得する方法」をご覧ください。


pathlibを使う書き方

Python 3.4以降ではpathlibも使えます。

import os
from pathlib import Path

print(os.getcwd())
print(Path.cwd())

実行結果(例):

/Users/user/projects
/Users/user/projects

見た目は同じですが、Path.cwd()が返すのは文字列ではなくPathオブジェクトです。

from pathlib import Path

print(type(Path.cwd()))
print(Path.cwd() / "data" / "input.csv")

実行結果(例):

<class 'pathlib.PosixPath'>
/Users/user/projects/data/input.csv

/演算子でパスを連結できるため、新しく書くコードではpathlibのほうが読みやすいことが多くあります。

詳しくは「Python Pathとは?pathlibでファイルパスを扱う方法を徹底解説」をご覧ください。


os.getcwd()のまとめ

  • os.getcwd()は現在の作業ディレクトリを絶対パスの文字列で返す
  • カレントディレクトリは「実行した場所」であって、ファイルの置き場所ではない
  • 相対パスはすべてカレントディレクトリが基準
  • スクリプトの場所を基準にしたいなら__file__を使う
  • ファイルが見つからないときはgetcwd()とlistdir()で現在地を確認する
  • pathlibならPath.cwd()

あわせて読みたい

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら