147

サブディレクトリ内のデータ ファイルを開く必要があるモジュールを含む python パッケージを作成しています./data/。現在、クラスと関数にハードコードされたファイルへのパスがあります。ユーザーのシステムにインストールされている場所に関係なく、サブディレクトリにアクセスできる、より堅牢なコードを書きたいと思います。

さまざまな方法を試しましたが、今のところうまくいきません。「現在のディレクトリ」コマンドのほとんどは、モジュールのディレクトリではなく、システムの python インタープリターのディレクトリを返すようです。

これは、些細で一般的な問題であるように思われます。それでも、私はそれを理解できないようです。問題の一部は、データ ファイルがファイル.pyではないため、インポート機能などを使用できないことです。

助言がありますか?

現在、私のパッケージ ディレクトリは次のようになっています。

/
__init__.py
module1.py
module2.py
data/   
   data.txt

data.txtからアクセスしようとしていますmodule*.py

4

6 に答える 6

191

これを行う標準的な方法は、setuptools パッケージと pkg_resources を使用することです。

このリンクに従って、次の階層に従ってパッケージをレイアウトし、データ リソースを指すようにパッケージ セットアップ ファイルを構成できます。

http://docs.python.org/distutils/setupscript.html#installing-package-data

次に、このリンクに従って、pkg_resources を使用してこれらのファイルを再検索して使用できます。

http://peak.telecommunity.com/DevCenter/PkgResources#basic-resource-access

import pkg_resources

DATA_PATH = pkg_resources.resource_filename('<package name>', 'data/')
DB_FILE = pkg_resources.resource_filename('<package name>', 'data/sqlite.db')
于 2011-04-08T23:42:39.203 に答える
25

__file__次のように、パッケージへのパスを取得するために使用できます。

import os
this_dir, this_filename = os.path.split(__file__)
DATA_PATH = os.path.join(this_dir, "data", "data.txt")
print open(DATA_PATH).read()
于 2009-04-22T22:37:04.197 に答える
8

モジュール全体の名前が必要です。ディレクトリツリーにはその詳細がリストされていません。私にとってはこれでうまくいきました:

import pkg_resources
print(    
    pkg_resources.resource_filename(__name__, 'data/data.txt')
)

特に setuptools は、パックされたデータ ファイルとの名前の一致に基づいてファイルを解決するようには見えないため、data/何があってもプレフィックスを含める必要があります。別のディレクトリ セパレータが必要な場合に使用できos.path.join('data', 'data.txt)ます。通常、ハードコードされた UNIX スタイルのディレクトリ セパレータとの互換性の問題はありません。

于 2015-12-10T09:59:33.883 に答える
5

答えを見つけたと思います。

モジュール data_path.py を作成し、次を含む他のモジュールにインポートします。

data_path = os.path.join(os.path.dirname(__file__),'data')

そして、すべてのファイルを

open(os.path.join(data_path,'filename'), <param>)
于 2009-04-22T22:35:52.187 に答える