Exemple de comment lire un fichier depuis un sous-répertoire d'un package en python:
Introduction
Supposons que nous voulons créer un nouveau package python (appelé "ideas4eo") à partir de zéro et que nous stockons des données dans un fichier json situé dans un sous-répertoire (ideas4eo/data/user):
ideas4eo/
data/user/
__init__.py
config.json
data_order/
__init__.py
nasa_laads_daac.py
le fichier config.json (contient un "token" utilisateur) :
{
"nasa_laads_daac": {
"token": "123456789"
}
}
et nous devons lire le fichier json à partir d'un script python appelé nasa_laads_daac.py situé dans le sous-répertoire ideas4eo/data_order.
(Option 1) Créer une fonction qui lit un fichier depuis un sous-répertoire d'un package python
Si vous essayez de lire le fichier json à partir de nasa_laads_daac.py en utilisant un chemin relatif ('../data/user/data.json'), cela ne fonctionnera pas :
import json
with open('../data/user/data.json') as json_data:
config_data = json.load(json_data)
token = config_data['nasa_laads_daac']['token']
Pour lire le fichier json, une solution consiste à utiliser pkg_resources de setuptools, exemple
import pkg_resources
import json
def get_token():
err_msg = []
try:
data_path = pkg_resources.resource_filename('ideas4eo.data.user', 'config.json')
with open(data_path) as json_data:
config_data = json.load(json_data)
token = config_data['nasa_laads_daac']['token']
except:
err_msg.append("Token Not found")
token = -1
return err_msg, token
(Option 2) Créer une fonction qui lit un fichier depuis un sous-répertoire d'un package python
Une autre solution possible consiste à utiliser importlib.resources – Resources. Voir l'article de stackoverflow: How to read a (static) file from inside a Python package? pour en apprendre plus.
Tester si le fichier est lu
Pour tester si cela fonctionne, lancez python en dehors du package (par exemple juste au-dessus du répertoire ideas4eo) et entrez
>>> import ideas4eo.data_order.nasa_laads_daac as t
>>> t.get_token()
'123456789'