Python在Package子目录中访问数据

我正在编写一个Python包与模块,需要打开./data/子目录中的数据文件。 现在我有硬编码到我的类和函数的文件的path。 我想编写更健壮的代码,可以访问子目录,而不pipe它在用户的系统上安装的位置。

我尝试了各种方法,但到目前为止,我没有运气。 似乎大多数“当前目录”命令返回系统的Python解释器的目录,而不是模块的目录。

这似乎应该是一个微不足道的常见问题。 但我似乎无法弄清楚。 部分问题是我的数据文件不是.py文件,所以我不能使用导入function等。

有什么build议么?

现在我的软件包目录如下所示:

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

我试图从module*.py访问data.txt

谢谢!

您可以使用下划线 – 下划线 – 文件 – 下划线 – 下划线( __file__ )来获取包的path,如下所示:

 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() 

标准的做法是使用setuptools包和pkg_resources。

您可以根据以下分层结构来布局软件包,并根据以下链接configuration软件包设置文件以指向您的数据资源:

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') 

为今天提供一个解决scheme。 绝对使用这个API来重新发明所有这些车轮。

需要一个真正的文件系统文件名。 压缩的鸡蛋将被提取到一个caching目录:

 from pkg_resources import resource_filename, Requirement path_to_vik_logo = resource_filename(Requirement.parse("enb.portals"), "enb/portals/reports/VIK_logo.png") 

为指定的资源返回一个可读的类文件对象; 它可能是一个实际的文件,一个StringIO,或一些类似的对象。 该stream处于“二进制模式”,即在资源中的任何字节将按原样读取。

 from pkg_resources import resource_stream, Requirement vik_logo_as_stream = resource_stream(Requirement.parse("enb.portals"), "enb/portals/reports/VIK_logo.png") 

使用pkg_resources打包发现和资源访问

我想我find了答案。

我做了一个模块data_path.py,我导入到我的其他模块包含:

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

然后我打开所有的文件

 open(os.path.join(data_path,'filename'), <param>) 

你需要一个名称为你的整个模块,你给的目录树没有列出的细节,对我来说这工作:

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

显然setuptools似乎不能解决基于与打包的数据文件的名称匹配的文件,所以你是gunna必须包括data/前缀几乎不pipe。 如果需要备用目录分隔符,可以使用os.path.join('data', 'data.txt) 。通常,我发现硬编码的unix样式目录分隔符没有兼容性问题。