前言:
在开发过程中,我们常常会用到一些固定参数或者常量,对于这些较为固定且常用到的部分,往往会将其写到一个固定文件中,避免在不同的模块代码中重复出现从而保持核心代码整洁
这个固定文件我们可以直接写成一个 .py
文件,例如 settings.py
或 config.py
,这样的好处就是能够在同一工程下直接通过 import
来导入当中的部分;但如果我们需要在其他非 Python 的平台进行配置文件共享时,写成单个 .py
就不是一个很好的选择。
这时我们就应该选择通用的配置文件类型来作为存储这些固定的部分。目前常用且流行的配置文件格式类型主要有 ini
、json
、toml
、yaml
、xml
等,这些类型的配置文件我们都可以通过标准库或第三方库来进行解析。
ini
ini
即 Initialize 初始化之意,早期是在 Windows 上配置文件的存储格式。ini
文件的写法通俗易懂,往往比较简单,通常由节(Section)、键(key)和值(value)组成,就像以下形式:
[localdb]
host = 127.0.0.1
user = root
password = 123456
port = 3306
database = mysql
Python 本身内置的 configparser标准库,我们直接就可以用来对 ini 文件 进行解析。如我们将上述内容保存在一个名为db.ini 的文件中,然后使用read() 方法来进行解析和读取,最后通过items() 方法来获取指定节点下的所有键值对。获取到键值对后,我其实直接就将其转换成字典,然后通过解包的方式进行穿参。
from configparser import ConfigParser
cfg = ConfigParser()
cfg.read('./db.ini')
dict(cfg.items('localdb'))
#Out:
#[('host', '127.0.0.1'),
# ('user', 'root'),
# ('password', '123456'),
# ('port', '3306'),
# ('database', 'mysql')]
需要==注意==的是,configparser
默认将值以字符串的形式呈现,所以这也就是为什么我们在 db.ini
文件中没有加引号而是直接将字面量写在上面的原因
toml
toml
格式(或 tml
格式)是 Github 联合创始人 Tom Preston-Werner 所提出的一种配置文件格式。根据维基百科的资料,toml
最开始提出时是在 2013年7月份,距今已有七年时间;它在某些方面也与后面要谈到的 yaml
文件有些类似,但如果当你知道 yaml 的规范有几十页(没有错,真的就是几十页……)的时候,可能你真的就不太愿意去写那么复杂的配置文件,toml
格式则倒是个不错的选择。
title = "TOML Example"
[woner]
name = "Tom Preston-Werner"
dob = 1979-05-27T07:32:00-08:00 #First class dates
[database]
server = "127.0.0.1"
ports = [8001,8001,8002]
connection_max = 5000
enabled = true
[server]
[server.alpha]
ip = "10.0.0.1"
dc = "eqdc10"
[server.beta]
ip = "10.0.0.2"
dt = "eqdc10"
[clients]
data = [["gamma","delta"],[1,2]]
hosts = [
"alpha",
"omega"
]
toml格式类似于前面讲的ini文件。但是它比ini扩展了更多的内容。
在上方我们可以看到,除了基本的字符串以外,例如时间戳,布尔值,数组等都进一步支持,而且样式和Python的原生写法十分类似。
pip install toml
该库的解析方法很简单,也有点类似于json库的解析用法,即通过 load() 或 loads() 来进行解析;同理转换并导出也是同样类似的用法
比如我们现在将以下内容写入到config.toml 中
[mysql]
host = "127.0.0.1"
user = "root"
port = "3306"
database = "test"
[mysql.parameters]
pool_size = 5
charset = "utf-8"
[mysql.fields]
pandas_cols = ["id","name","age","date"]
紧接着我们就可以通过toml库中的load() 方法来进行读取:
import toml
import os
from pprint import pprint
cfg = toml.load(os.path.expanduser('./config.toml'))
pprint(cfg)