Python 我应该如何处理包所需的数据?

Python 我应该如何处理包所需的数据?,python,io,packages,Python,Io,Packages,我有一个python包,需要一个数据文件才能工作。 目前,我只是使用open(“,'r')从中读取数据 但是,此操作的成功与否取决于当前目录。我觉得有一种方法可以告诉python在相对于包源的目录中查找文件,而不是相对于使用包的文件 对于JVM语言,有一个“resource”目录和运行良好的Class.getResource。python有一些等价物吗?如果没有,处理此问题的标准方法是什么?模块通常有一个\uuuuu file\uuuuuuu属性,以告知包的来源。例如,对于re: >>

我有一个python包,需要一个数据文件才能工作。 目前,我只是使用
open(“,'r')
从中读取数据

但是,此操作的成功与否取决于当前目录。我觉得有一种方法可以告诉python在相对于包源的目录中查找文件,而不是相对于使用包的文件


对于JVM语言,有一个“resource”目录和运行良好的
Class.getResource
。python有一些等价物吗?如果没有,处理此问题的标准方法是什么?

模块通常有一个
\uuuuu file\uuuuuuu
属性,以告知包的来源。例如,对于
re

>>> import re
>>> re.__file__
'/usr/lib/python3.5/re.py'
>>> os.path.dirname(re.__file__)
'/usr/lib/python3.5'
或对于
烧瓶

>>> import flask
>>> flask.__file__
'/home/foo/.local/lib/python3.5/site-packages/flask/__init__.py'
>>> os.path.dirname(flask.__file__)
'/home/foo/.local/lib/python3.5/site-packages/flask'
然后可以使用
os.path.dirname
获取目录,并使用
os.path.join
将路径与新文件名连接在一起

因此,假设您要加载与
re
包相关的文件,可以使用:

import re
import os

with open(os.path.join(os.path.dirname(re.__file__),'foo.data'),'r') as f:
#                                                    ^ relative pathname
    pass

使用
'foo.data'
这里是一个相对于
re
包文件的文件。

模块通常有一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu属性,以告知包的来源。例如,对于
re

>>> import re
>>> re.__file__
'/usr/lib/python3.5/re.py'
>>> os.path.dirname(re.__file__)
'/usr/lib/python3.5'
或对于
烧瓶

>>> import flask
>>> flask.__file__
'/home/foo/.local/lib/python3.5/site-packages/flask/__init__.py'
>>> os.path.dirname(flask.__file__)
'/home/foo/.local/lib/python3.5/site-packages/flask'
然后可以使用
os.path.dirname
获取目录,并使用
os.path.join
将路径与新文件名连接在一起

因此,假设您要加载与
re
包相关的文件,可以使用:

import re
import os

with open(os.path.join(os.path.dirname(re.__file__),'foo.data'),'r') as f:
#                                                    ^ relative pathname
    pass

使用
'foo.data'
这里是一个相对于
re
包文件的文件。

似乎已经工作了。有一件事,就是在
“../foo.data”
中使用正斜杠严格正确吗?path.join似乎在我的windows机器上生成了类似“\\a\\b\\../foo.data”的东西,它可以处理,但我可以想象另一种方式不太好。@Lucas:好的观点。我对Linux有点太习惯了。所以,安全总比后悔好。这似乎奏效了。有一件事,就是在
“../foo.data”
中使用正斜杠严格正确吗?path.join似乎在我的windows机器上生成了类似“\\a\\b\\../foo.data”的东西,它可以处理,但我可以想象另一种方式不太好。@Lucas:好的观点。我对Linux有点太习惯了。所以,安全总比后悔好。