Pythonの開発の際、私はVisual Studio Code を使うことが多いのですが、その際、デバッグ実行しようとすると、実行時のカレントディレクトリの位置のせいで、外部ファイルが読み込めないということがたまに発生します。
(私の場合、特に、ワークスベース内にディレクトリ分けしてソースを作っているからですねー💦)
そういうことにならないために、ソースコード上に明示的に、ソースコードのディレクトリ上の位置を書きたいとこなのですが、ベタでフルパスで書くという方法はファイルの場所が変わったときや配布することを考えると望ましくはありません。なので、動的にその場所を取得する方法を紹介しておきます。
こんな感じで、テキストファイルを読み込んで出力するだけのプログラムを適当に書いてみます。
Visual Stukio Codeの実行ボタン(または、デバッグ実行ボタン)をクリックすると案の定、こんな感じで「FileNotFoundErrr(ファイルが存在しないことを示すエラー)」になります。
そりゃそうですよね。実行時のカレントディレクトリの場所に読み込むファイルがないためです。
そこで、ソースを↓のように書き換えるわけです。
import os
dirname = os.path.dirname(__file__)
test_data = open(dirname + "/hoge.txt", "r")
for i in test_data:
print(i)
test_data.close()
これは何をしているのかというと、ソースコードファイルの場所を取得して、それを基準にファイルを指定するようにしているのです。
**「__file__」**は、ソースコードのファイルを示す予約後で、「os.path.dirname(str)」関数を使うことで、ソースコードファイルのあるディレクトリを取得するという意味になります。
これで、問題なく、ファイルが見つかってファイルの内容が表示できるわけですね。
めでたしめでたしー
【補足】
ついでに補足ですが、、
↓のソースを実行してみると。。
import os
# カレントディレクトを取得
print('getcwd: ', os.getcwd())
# ソースコードファイルのパスを取得
print('__file__: ', __file__)
# ソースコードファイルのファイル名のみを取得
print('basename: ', os.path.basename(__file__))
# ソースコードファイルのディレクトリのみを取得
print('dirname: ', os.path.dirname(__file__))
getcwd: H:\Project\PythonTest
__file__: h:\Project\PythonTest\Base\test01.py
basename: test01.py
dirname: h:\Project\PythonTest\Base
以上です。こういうのって割と便利なので、覚えておきましょー。
何かの参考にしていただければ幸いです。