はじめに
Pythonの標準ライブラリのosについて、実務でよく使う割になかなか覚えられないos.path()によるパス操作をまとめました。
パス操作
osはパス操作以外にもファイル名の変更(os.rename())や削除(os.remove())などもできるが、パス操作はos.path()により行う。
フォルダ構成
python_os_path
├─ src
│ └─ path.py
└─ main.py
以降はmain.pyをエントリーポイントとし、os.getcwd()との挙動の違いを確認する。
main.py
import os
import subprocess
if __name__ == "__main__":
# NOTE: Windowsではパス区切りが \ となり問題となる可能性があるためjoinを使う
# path = f"{os.path.dirname(__file__)}/src/path.py"
path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "src", "path.py")
subprocess.run(["python", path])
ターミナル
python main.py
取得
スクリプト自身の絶対パスを取得
path.py
# NOTE: __file__は絶対パスと相対パスになり得るためabspathで絶対パスに統一して使用するのがコツ
abs_path = os.path.abspath(__file__)
print(abs_path) # /Users/~/python_os_path/src/path.py
指定パス(abs_path)からディレクトリ名を取得
path.py
dir = os.path.dirname(abs_path)
print(dir) # /Users/~/python_os_path/src
指定パスからファイル名を取得
path.py
file = os.path.basename(abs_path)
print(file) # path.py
実行場所のパスを取得
path.py
exe_path = os.getcwd()
print(exe_path) # /Users/~/python_os_path
分割
指定パスからディレクトリ名とファイル名を分割
path.py
dir, file = os.path.split(abs_path)
print(dir) # /Users/~/python_os_path/src
print(file) # path.py
指定パスからファイル名と拡張子を分割
path.py
file, ext = os.path.splitext(abs_path)
print(file) # /Users/~/python_os_path/src/path
print(ext) # .py
結合
path.py
joined_path = os.path.join(dir, "path.py")
print(joined_path) # /Users/~/python_os_path/src/path.py
存在確認
path.py
is_path = os.path.exists(joined_path)
print(is_path) # True
おわりに
標準ライブラリのpathlibでも同じようなことができて使っているケースも多いので、使うようになったらpathlibもまとめようと思います。
参考文献