Comment lire un fichier depuis un sous-répertoire d'un package en python ?

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'

Références