尝试读取 Python 包中的 JSON 文件

Mas*_*son 10 python setuptools package python-packaging

我正在打包一个 python 包,我将其称为MyPackage.

包结构为:

MyPackage/
    script.py
    data.json
Run Code Online (Sandbox Code Playgroud)

data.json文件包含读取的缓存数据script.py

我已经想出了如何包含数据文件(使用 setuptoolsinclude_package_data=True并在文件中包含数据文件的路径MANIFEST.in)但是现在当我 pip 安装此包并导入已安装的 MyPackage(当前测试安装pip来自 GitHub 存储库)我得到FileNotFound脚本中使用 MyPackage的异常 (data.json)。但是,我看到该data.json文件确实安装在Lib/site-packages/MyPackage.

通过尝试读取json包中的文件,我在这里做错了吗?

请注意,在script.py我试图读data.jsonopen('data.json', 'r')

我是否搞砸了有关数据文件路径的问题?

Arn*_*rne 12

你没有搞砸什么,访问包资源只是有点棘手 - 主要是因为它们可以打包成你的 .json 严格来说可能不作为安装包的系统上的实际文件存在的格式(例如作为zip -应用程序)。访问数据文件的正确方法不是指定它的路径(如"MyPackage/data.json"),而是将其作为已安装包的资源(如"MyPackage.data.json")进行访问。这种区别可能看起来很迂腐,但它可能很重要。

无论如何,应该使用内置importlib.resources模块进行访问:

import importlib.resources
import json

with importlib.resources.open_text("MyPackage", "data.json") as file:
    data = json.load(file)  
# you should be able to access 'data' like a dictionary here
Run Code Online (Sandbox Code Playgroud)

如果您碰巧使用低于 3.7 的 python 版本,则必须importlib_resources从 pyPI安装它。