importlib.resources快速读取配置文件
概述
在日常的工作中,经常要用到配置文件,进行环境配置或数据驱动等。通常会把这些文件放在resources目录下统一管理,可以是json,可以是yaml。
如以下目录结构:
$ tree -I __pycache__ .
├── resources
│ └── config.json
├── read_config.py
常规做法
- 获取当前执行文件的路径
- 拼出配置文件的路径后再读取
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快速读取
前提条件:
- python版本不低于3.7
- 目录结构如下,即把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的第一个参数,这样才能正确读取