本文为 .py
文件创建配置文件,读取及更新配置文件内容进行不完全总结 1’ 2。
Updated: 2022 / 8 / 11
有些自动化脚本要反复使用,但是每次使用都有一些参数要改,比如路径、时间间隔等等。
每次打开源文件改这些参数时免不了看到大片的代码,因此可以借助配置文件来保存这些可能要人工修改的参数。
截至目前,可以使用的配置文件的文件类型有 init
, json
, toml
和 yaml
。
.ini
文件是 Initialization File
的缩写,即初始化文件,是 windows
的系统配置文件所采用的存储格式,统管 windows
的各项配置。
.ini
文件通常由 节(Section)
、键(key)
和 值(value)
组成。具体形式如下:
; 关于mysql的一个小配置
; db.ini
[mysql]
host = 127.0.0.1
port = 3306
user = root
password = 123456
database = test
使用 python
内置的 configparser
标准库进行解析 ini
文件。
方法 | 含义 |
---|---|
read() | 读取文件内容 |
items() | 获取指定节的所有键值对 |
JSON
(JavaScript Object Notation
) 是一种轻量级的数据交换格式。
它的语法格式的示例如下:
{
"mysql": {
"host": "127.0.0.1",
"port": 3306,
"user": "root",
"password": "123456",
"database": "test"
}
}
使用 python
内置的 json
标准库进行解析。
方法 | 含义 |
---|---|
loads | 从 json 文件中读取 json 格式数据 |
loads | 将字符串类型数据转化为 json 格式数据 |
dump | 将 json 格式数据保存到文件 |
dumps | 将 json 格式数据保存为字符串类型 |
创建 config.json
, 如下所示:
{
"target_dir" = "E:/data",
"interval_mins" = 5,
"time_record" = "201904011230"
}
在你的 main.py
中增加两个函数分别用于读取和更新配置文件 config.json
:
def read_config():
""""读取配置"""
with open("config.json") as json_file:
config = json.load(json_file)
return config
def update_config(config):
""""更新配置"""
with open("config.json", 'w') as json_file:
json.dump(config, json_file, indent=4)
return None
当通过 config = read_config()
获得的配置 config
是一个字典,不能直接使用如 target_dir
等键值当做变量使用,可以间接用如 config["target_dir"]
来当变量,但并不方便。通常做法是每个变量执行一次类似 target_dir = config["target_dir"]
的操作,如果配置变量较多就比较累了。
那么,重点来了:
globals().update(config)
globals()
获得(模块级)全局变量所组成的字典,它的 .update()
方法将字典内容转为变量,修改该字典等同修改全局变量。举个例子:
a_dict = {"key": "value"}
globals().update(a_dict)
print(key)
# value
虽然没有显式定义变量 key
,但依然可以正确输出 value
重点结束。
修改字典 config
后,只要 update_config(config)
,就实现了配置文件 config.json
的更新,可以说是非常简单了。
TOML
是 Github
联合创始人 Tom Preston-Werner
所提出的一种配置文件格式,是一种旨在成为一个小规模、易于使用的语义化的配置文件格式,它被设计为可以无二义性的转换为一个哈希表。
TOML
的语法广泛地由 key = "value"
、[节名]
、#注释
构成。
支持以下数据类型:字符串、整形、浮点型、布尔型、日期时间、数组和图表。
创建 config.toml
, 如下所示:
# config.toml
[mysql]
[mysql.config]
host = "127.0.0.1"
user = "root"
port = 3306
password = "123456"
database = "test"
[mysql.parameters]
pool_size = 5
charset = "utf8"
[mysql.fields]
course_cols = ["cno", "cname", "ccredit", "cdept"]
使用外部库 toml
解析 toml
文件,
在你的 main.py
中增加两个函数分别用于读取和更新配置文件 config.toml
:
def read_config():
""""读取配置"""
with open("config.toml") as toml_file:
config = toml.load(toml_file)
return config
def update_config(config):
""""更新配置"""
with open("config.toml", 'w') as toml_file:
toml.dump(config, toml_file)
return None
比如,使用 read_config()
函数读取 config.toml
文件所读取到的内容如下所示:
{
"mysql": {
"config": {
"host": "127.0.0.1",
"user": "root",
"port": 3306,
"password": "123456",
"database": "test"
},
"parameters": {
"pool_size": 5,
"charset": "utf8"
},
"fields": {
"course_cols": [
"cno",
"cname",
"ccredit",
"cdept"
]
}
}
}
YAML
( YAML Ain't a Markup Language
, YAML
不是一种标记语言) 格式是目前较为流行的一种配置文件,它早在 2001 由一个名为 Clark Evans
的人提出;同时它也是目前被广泛使用的配置文件类型。
它的语法格式的示例如下:
# db.yaml
mysql:
config:
host: "127.0.0.1"
port: 3306
user: "root"
password: ""
database: "stu_sys"
parameters:
pool_size: 5
charset: "utf8"
fileds:
course_cols:
- cno
- cname
- ccredit
- cdept
使用外部库 pyyaml
解析 yaml
文件,
在你的 main.py
中增加两个函数分别用于读取和更新配置文件 config.yaml
:
def read_config():
""""读取配置"""
with open("config.yaml") as yaml_file:
config = yaml.safe_load(yaml_file)
return config
def update_config(config):
""""更新配置"""
with open("test.yaml", 'w') as yaml_file:
yaml.dump(config, yaml_file)
return None
比如,使用 read_config()
函数读取 config.yaml
文件所读取到的内容如下所示:
{
"mysql": {
"config": {
"host": "127.0.0.1",
"port": 3306,
"user": "root",
"password": "",
"database": "stu_sys"
},
"parameters": {
"pool_size": 5,
"charset": "utf8"
},
"fileds": {
"course_cols": [
"cno",
"cname",
"ccredit",
"cdept"
]
}
}
}