他们晓得,当你把两个天然资源文档和两个.py文档放到一同的这时候,你能间接在那个.py文档中,采用文档名加载它。比如:
with open(test.txt) as f:
content = f.read()
print(文档中的文本为:, content)
运转效用如下表所示图右图:
但请注意,这儿我是间接运转的read.py那个文档。假如天然资源文档是存放到两包(package)里头,接着我们在外边初始化那个包里头的.py文档会好不好呢?他们试试看:
能看见,那时Python 早已找不出那个文档了。这原因在于,他们的出口处流程在 ~/get_title文档夹中,而test.txt文档在~/get_title/util文档夹中。即使他们运转的是main.py,因此 Python 会在~/get_title文档夹里头找寻test.txt,大自然就找不出了。
假如是提及包里头的其它组件,能采用相对路径。比如提及同两包里头名为sql_util.py里头的conn第一类,他们能间接记为from .sql_util import conn。但天然资源文档无法采用四元组来加载,如下表所示图右图:
有两个笨办
import os
def read_file():
current_folder = os.path.dirname(__file__)
resource_path = os.path.join(current_folder, test.txt)
with open(resource_path) as f:
content = f.read()
print(文档中的文本为:, content)
运转效用如下表所示图右图:
但这样写稍显麻烦。
假如你的 Python 版本不低于3.7,那么你能采用importlib.resources来快速加载天然资源文档:
from importlib import resources
with resources.open_text(包名, 天然资源路径) as f:
content = f.read()
运转效用如下表所示图右图:
假如你加载的不是文本文档,那么你能把resources.open_text改成resources.open_binary,从而加载二进制文档。
但需要注意的是,天然资源文档必须放到包的根目录。这样才能恰当加载。假如天然资源文档在包内部的子目录中,importlib.resources是无法间接加载的。
比如他们的包为util,里头有两个文档夹叫做deep_folder,天然资源文档test.txt放到deep_folder中,此时,他们假如要加载那个天然资源文档,就必须把在deep_folder文档夹中创建两个__init__.py,把它也变成两包。接着修改read.py的代码:
fromimportlibimport resources
from . import deep_folder
def read_file():
withresources.open_text(deep_folder, test.txt)as f:
content = f.read()
print(文档中的文本为:, content)
把deep_folder作为两个 module 导入,接着把那个 module 作为resources.open_text的第两个参数。这样才能恰当加载,如下表所示图右图: