首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >访问包子目录中的数据

访问包子目录中的数据
EN

Stack Overflow用户
提问于 2009-04-22 22:17:52
回答 4查看 60.8K关注 0票数 147

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

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

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

有什么建议吗?

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

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-04-22 22:37:04

您可以使用__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()
票数 25
EN

Stack Overflow用户

发布于 2011-04-09 07:42:39

执行此操作的标准方法是使用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')
票数 189
EN

Stack Overflow用户

发布于 2015-12-10 17:59:34

你需要为你的整个模块命名,你得到的目录树没有列出那个细节,对我来说这是可行的:

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

值得注意的是,setuptools似乎不能根据与压缩数据文件匹配的名称来解析文件,所以无论如何你都必须包含data/前缀。如果你需要备用的目录分隔符,你可以使用os.path.join('data', 'data.txt),不过我发现通常与硬编码的unix风格的目录分隔符没有兼容性问题。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/779495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档