web-dev-qa-db-ja.com

「常に現在のモジュールからの相対パス」のファイルパスを作成する方法

あなたが含むモジュールがあるとしましょう

_myfile = open('test.txt', 'r')
_

また、「test.txt」ファイルは同じフォルダにあります。モジュールを実行すると、ファイルが正常に開かれます。

ここで、別のフォルダにある別のモジュールからそのモジュールをインポートするとします。ファイルは、そのコードがあるモジュールと同じフォルダーで検索されません。

モジュールを同じフォルダー内の相対パスでファイルを最初に検索する方法は?

「___file___」または「os.getcwd()」を使用してさまざまな解決策がありますが、open()またはfile( )。

55
user975135

解決策は__file__そしてそれはかなりきれいです:

import os

TEST_FILENAME = os.path.join(os.path.dirname(__file__), 'test.txt')
50
yak

.pyファイルからロードされた通常のモジュールの場合、 __file__ が存在し、使用可能である必要があります。 __file__からの情報を相対パスに結合するには、2014年以降に利用可能なos.pathインターフェースよりも新しいオプションがあります。

from pathlib import Path

here = Path(__file__).parent
with (here/'test.txt').open() as myfile:
    ...

pathlib はPythonに追加されました- PEP428 を参照してください。まだPython 2.7同じAPIを使用したい場合 バックポートが利用可能

利用可能な最新のアプローチの適用に関心のあるユーザーは、ソースツリーに関連するデータファイルを結合するのではなく、 importlib-resources に移動することを検討する必要があります。現在、互換性をPython 3.7+のみ)に制限する贅沢を持っているユーザーはほとんどいないため、これを最先端にいることを好む人へのヘッズアップとして言及します。

8
wim