访问包子目录中的数据

2024-05-21 00:32:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个python包,其中包含需要在./data/子目录中打开数据文件的模块。现在我有到文件的路径硬编码到我的类和函数中。我想编写更健壮的代码,无论子目录安装在用户系统的什么位置,都可以访问它。

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

这似乎应该是一个微不足道的常见问题。但我好像想不出来。部分问题是我的数据文件不是.py文件,所以我不能使用导入函数等。

有什么建议吗?

现在我的包目录看起来像:

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

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


Tags: 模块文件方法函数代码用户py路径
3条回答

可以使用__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()

为今天的工作提供解决方案。一定要使用这个API来避免重新发明所有的轮子。

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

from pkg_resources import resource_filename, Requirement

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

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

from pkg_resources import resource_stream, Requirement

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

使用pkg_资源的包发现和资源访问

标准的方法是使用setuptools包和pkg_资源。

您可以按照以下层次结构排列包,并根据此链接配置包设置文件以将其指向您的数据资源:

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

然后,您可以使用pkg_资源重新查找和使用这些文件,如下链接所示:

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

相关问题 更多 >