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