前言:
在開發(fā)過程中,我們常常會(huì)用到一些固定參數(shù)或者常量,對于這些較為固定且常用到的部分,往往會(huì)將其寫到一個(gè)固定文件中,避免在不同的模塊代碼中重復(fù)出現(xiàn)從而保持核心代碼整潔
這個(gè)固定文件我們可以直接寫成一個(gè) .py 文件,例如 settings.py 或 config.py,這樣的好處就是能夠在同一工程下直接通過 import 來導(dǎo)入當(dāng)中的部分;但如果我們需要在其他非 Python 的平臺(tái)進(jìn)行配置文件共享時(shí),寫成單個(gè) .py 就不是一個(gè)很好的選擇。
這時(shí)我們就應(yīng)該選擇通用的配置文件類型來作為存儲(chǔ)這些固定的部分。目前常用且流行的配置文件格式類型主要有 ini、json、toml、yaml、xml 等,這些類型的配置文件我們都可以通過標(biāo)準(zhǔn)庫或第三方庫來進(jìn)行解析。
ini
ini 即 Initialize 初始化之意,早期是在 Windows 上配置文件的存儲(chǔ)格式。ini 文件的寫法通俗易懂,往往比較簡單,通常由節(jié)(Section)、鍵(key)和值(value)組成,就像以下形式:
[localdb]
host = 127.0.0.1
user = root
password = 123456
port = 3306
database = mysql
Python 本身內(nèi)置的 configparser標(biāo)準(zhǔn)庫,我們直接就可以用來對 ini 文件 進(jìn)行解析。如我們將上述內(nèi)容保存在一個(gè)名為db.ini 的文件中,然后使用read() 方法來進(jìn)行解析和讀取,最后通過items() 方法來獲取指定節(jié)點(diǎn)下的所有鍵值對。獲取到鍵值對后,我其實(shí)直接就將其轉(zhuǎn)換成字典,然后通過解包的方式進(jìn)行穿參。
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 默認(rèn)將值以字符串的形式呈現(xiàn),所以這也就是為什么我們在 db.ini 文件中沒有加引號(hào)而是直接將字面量寫在上面的原因
toml
toml 格式(或 tml 格式)是 Github 聯(lián)合創(chuàng)始人 Tom Preston-Werner 所提出的一種配置文件格式。根據(jù)維基百科的資料,toml 最開始提出時(shí)是在 2013年7月份,距今已有七年時(shí)間;它在某些方面也與后面要談到的 yaml 文件有些類似,但如果當(dāng)你知道 yaml 的規(guī)范有幾十頁(沒有錯(cuò),真的就是幾十頁……)的時(shí)候,可能你真的就不太愿意去寫那么復(fù)雜的配置文件,toml 格式則倒是個(gè)不錯(cuò)的選擇。
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擴(kuò)展了更多的內(nèi)容。
在上方我們可以看到,除了基本的字符串以外,例如時(shí)間戳,布爾值,數(shù)組等都進(jìn)一步支持,而且樣式和Python的原生寫法十分類似。
pip install toml
該庫的解析方法很簡單,也有點(diǎn)類似于json庫的解析用法,即通過 load() 或 loads() 來進(jìn)行解析;同理轉(zhuǎn)換并導(dǎo)出也是同樣類似的用法
比如我們現(xiàn)在將以下內(nèi)容寫入到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() 方法來進(jìn)行讀?。?/p>
import toml
import os
from pprint import pprint
cfg = toml.load(os.path.expanduser('./config.toml'))
pprint(cfg)