与使用Class.getResource()等效的python相同

时间:2011-12-08 04:32:42

标签: java python

在java中如果我想读取包含我的算法的资源数据的文件,我该怎么做才能正确引用路径。

澄清 我试图理解在Python世界中如何将数据与模块中的代码打包在一起。

例如,我可能正在编写一些查看字符串并尝试对文本编写语言进行分类的代码。为此,我需要一个包含语言模型数据的文件。

因此,当我的代码被调用时,我想加载与模块一起打包的文件(或多个文件)。我不清楚我应该如何在Python中做到这一点。

TIA。

3 个答案:

答案 0 :(得分:1)

我想你可能正在寻找pkgutil.get_data()。这方面的文档说:

pkgutil.get_data(package, resource)
  

从包中获取资源。

     

这是PEP 302加载器get_data()API的包装器。包裹   参数应该是标准模块格式的包名称   (foo.bar)。资源参数应该是相对的形式   filename,使用/作为路径分隔符。父目录名称..   是不允许的,也不是根的名称(以/)开头。

     

该函数返回一个二进制字符串,该字符串是该内容   指定资源。

     

对于位于文件系统中的软件包,已经存在   导入,这是相当于:

d = os.path.dirname(sys.modules[package].__file__)
data = open(os.path.join(d, resource), 'rb').read()
     

如果包不能   定位或装载,或使用不支持的PEP 302装载机   get_data(),然后返回None。

答案 1 :(得分:0)

我认为您正在寻找imp.load_source

import imp

module = imp.load_source('ModuleName', '/path/of/the/file.py')
module.FooBar()

答案 2 :(得分:0)

对于不知道的Pythonistas,Java的Class.getResource的行为基本上是:提供的文件名是(除非它已经是绝对路径)通过使用类'包来转换为相对路径(因为期望类文件的目录路径镜像该类的显式“包”声明。用于首先加载类的ClassLoader然后通过它自己的逻辑将此路径字符串转换为可以编码文件名,WWW上的位置等的URL对象。

Python不是Java,所以我们必须近似一些事情并阅读问题的意图。

Python类并没有真正明确地进入包,尽管您可以通过将包放在包含额外__init__.py文件的文件夹中来创建包。

Python实际上并没有像标准库中的URL类那样的东西;尽管有足够的支持连接到Internet,但通常希望您只使用字符串来表示URL(和文件名)并对其进行适当的格式化。这可以说是一个不幸错失的多态性机会(虽然你可能会错过许多特殊情况和有用的功能,但制作自己的包装并不难。)无论如何,在使用Java的正常情况下,您不希望从此过程中获取Web URL。

Python有一个“工作目录”的概念,它依赖于Python进程的启动方式。文件路径必然相对于“主类”(嗯,真的,“主模块”,因为Python不会让你把所有东西放在一个类中)的目录。

所以你真正想要的是可能,就是将磁盘上的绝对路径提供给类对应的源文件。但这也不会成功。问题是:给定一个类,您可以获取它来自的模块的名称,然后查找该名称以获取实际的模块对象,然后从模块对象获取加载模块的文件名。但是,该文件名与加载模块时的工作目录相关,并且不记录该信息。如果从那时起工作目录发生了变化(使用os.chdir),那你就不幸了。

请尝试更清楚地了解您真正尝试做什么。