自分はプログラムを書く中で, よく参照するファイルを絶対パス形式で直打ちすることが多い (相対パスだとcronとかで動かす時にたまにエラーを吐かれて面倒だから)
が, 案の定面倒くさい
なので, プログラム中からディレクトリ名を取得する方法がないか調査したら, os.pathの関数を使えばいけるらしかったので, 備忘録も兼ねて紹介しておく
dirnameとabspath
まず, 使用する関数はdirnameとabspathの2つ
この2つを組み合わせることで取得可能となる.
os.path.dirnameは, 引数で渡したパス名からディレクトリ名の部分だけ抜き出す関数
例はこんな感じ
>>> import os
>>> os.path.dirname("test.py")
''
>>> os.path.dirname("/User/Program/test.py")
'/User/Program'
>>> os.path.dirname("/User/Program")
'/User'
os.path.abspathは引数で与えたパス名の絶対パスを取得する関数
例はこんな感じ
>>> os.path.abspath("test.py")
'/User/Program/test.py'
>>> os.path.abspath("/User/Program/test.py")
'/User/Program/test.py'
>>> os.path.abspath("/User/Program/")
'/User/Program'
>>> os.path.abspath(".")
'/User/Program'
ディレクトリ名の獲得
dirnameとabspathを使い, 実行中のスクリプトのディレクトリ名を取得する書き方はこのようになる
print(os.path.dirname(os.path.abspath(__file__)))
/Usr/Program
まとめ
dirnameとabspathを組み合わせることで, ディレクトリ名の獲得をプログラム中で行えるようになった
これで参照するファイル名だけを直打ちあるいは実行時の引数として渡すだけで良くなる
ちなみに, 存在しないファイル名を引数にして試しに実行してみたところ, エラーを吐くことなくカレントデディレクトリの名前が返ってきた
なので, 引数に渡したファイルがどこにあるのかを走査している訳ではないらしい
疑問点
この記事を書いてる際に疑問が生じたので書いておく
ディレクトリ名を獲得するあの書き方は, 他の記事でもよく紹介されているため, おそらくメジャーな書き方なのだろう
しかし, os.path.abspath(".")でも同じものが獲得できるので, わざわざ2つを組み合わせたあの書き方をする必要はない(というか, os.path.abspath(".")の方が短いためこっちでいい気がする)
なぜ2つ組み合わせた書き方が多く紹介されてるのだろうか・・・