85

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

myfile = open('test.txt', 'r')

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

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

では、最初に同じフォルダ内の相対パスを使用してモジュール検索ファイルを作成するにはどうすればよいですか?

__file__「 」または「 」を使用することでさまざまな解決策がありos.getcwd()ますが、open()またはfile()に渡す文字列内の同じ特殊文字のように、よりクリーンな方法があることを望んでいます。

4

2 に答える 2

102

解決策は使用すること__file__であり、それはかなりきれいです:

import os

TEST_FILENAME = os.path.join(os.path.dirname(__file__), 'test.txt')
于 2012-04-16T13:04:00.200 に答える
41

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

from pathlib import Path

here = Path(__file__).parent
fname = here / "test.txt"
with fname.open() as f:
    ...

pathlib3.4でPythonに追加されました-PEP428を参照してください。同じAPIを使用したいPython2.7をまだ使用しているユーザーのために、バックポートを利用できます

Pythonパッケージを使用している場合は、リソースを読み取るためのより良いアプローチが利用可能であることに注意してください。importlib-resourcesへの移行を検討できます。これにはPython3.7以降が必要です。古いバージョンではを使用できますpkgutil。ソースツリーに関連してデータファイルを結合するのではなく、リソースを正しくパッケージ化することの利点の1つは、ファイルシステム(zipファイル内のパッケージなど)で抽出されない場合でもコードが機能することです。Pythonパッケージ内から(静的)ファイルを読み取る方法を参照してください。パッケージ内のデータファイルの読み取り/書き込みの詳細については。

于 2018-09-10T23:07:55.643 に答える