importlib.resources快速读取配置文件

概述

在日常的工作中,经常要用到配置文件,进行环境配置或数据驱动等。通常会把这些文件放在resources目录下统一管理,可以是json,可以是yaml。
如以下目录结构:

$ tree -I __pycache__ .
├── resources
│   └── config.json
├── read_config.py

常规做法

  1. 获取当前执行文件的路径
  2. 拼出配置文件的路径后再读取
import os
import json

CURRENT_PATH = os.path.dirname(__file__)
CONFIG_PATH = os.path.join(CURRENT_PATH, 'resources/config.json')
with open(CONFIG_PATH, 'r') as f:
    CONFIG = json.loads(f.read())
get_token_url = CONFIG['get_token']
print(get_token_url)

importlib.resources快速读取

前提条件:

  1. python版本不低于3.7
  2. 目录结构如下,即把resource变成一个包,且配置文件放在包的根目录
$ tree -I __pycache__ .
├── resources
│   ├── __init__.py
│   └── config.json
├── read_config.py

快速配置

import json
from importlib import resources

with resources.open_text("resources", "config.json") as f:
    CONFIG = json.loads(f.read())
get_token_url = CONFIG['get_token']
print(get_token_url)

with resources.open_text('包名', '配置文件路径') as f:
如果读取的不是文本文件,可以把resources.open_text改成resources.open_binary,从而读取二进制文件

读取更深目录下的配置

如以下的目录:

$ tree -I __pycache__ .
.
├── config.txt
├── read_config.py
├── resources
│   ├── __init__.py
│   ├── config.json
│   └── deep_folder
│       ├── __init__.py
│       └── deep_folder_config.json

同样在deep_folder文件夹中创建一个__init__.py,把它也变成一个包,然后修改代码如下:

import json
from importlib import resources
from resources import deep_folder

with resources.open_text(deep_folder, "deep_folder_config.json") as f: # 注意deep_folder不需要加""
    CONFIG = json.loads(f.read())
get_token_url = CONFIG['get_token']
print(get_token_url)

把deep_folder作为一个 module 导入,然后把这个 module 作为resources.open_text的第一个参数,这样才能正确读取