0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonでソースコードファイルのディレクトリ位置を指定して外部ファイルをロードする方法

Last updated at Posted at 2021-12-30

Pythonの開発の際、私はVisual Studio Code を使うことが多いのですが、その際、デバッグ実行しようとすると、実行時のカレントディレクトリの位置のせいで、外部ファイルが読み込めないということがたまに発生します。
(私の場合、特に、ワークスベース内にディレクトリ分けしてソースを作っているからですねー💦)

そういうことにならないために、ソースコード上に明示的に、ソースコードのディレクトリ上の位置を書きたいとこなのですが、ベタでフルパスで書くという方法はファイルの場所が変わったときや配布することを考えると望ましくはありません。なので、動的にその場所を取得する方法を紹介しておきます。

こんな感じで、テキストファイルを読み込んで出力するだけのプログラムを適当に書いてみます。

画像の貼り付け先_ 2021-12-30 12-48.png

Visual Stukio Codeの実行ボタン(または、デバッグ実行ボタン)をクリックすると案の定、こんな感じで「FileNotFoundErrr(ファイルが存在しないことを示すエラー)」になります。
そりゃそうですよね。実行時のカレントディレクトリの場所に読み込むファイルがないためです。

画像の貼り付け先_ 2021-12-30 12-49.png

そこで、ソースを↓のように書き換えるわけです。

testBase.py
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)」関数を使うことで、ソースコードファイルのあるディレクトリを取得するという意味になります。

画像の貼り付け先_ 2021-12-30 12-56.png

これで、問題なく、ファイルが見つかってファイルの内容が表示できるわけですね。
めでたしめでたしー:clap::clap::clap::clap:

【補足】
ついでに補足ですが、、
↓のソースを実行してみると。。

test01.py
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

以上です。こういうのって割と便利なので、覚えておきましょー。
何かの参考にしていただければ幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?