配置文件常為程序運行提供參數,為參數的統一管理提供便利。本文以Python語言為例,講解各種配置文件的用法。
INIINI取自英文initialization(初始)的首字縮寫,常常使用在Windows作業系統上,由節、鍵、值組成。節用[section]表示,鍵值用=連接,注釋用;,不同節間一般用空行分隔。
優點
面向大眾,簡潔易懂,非專業人員也能看懂。
缺點
無法表現數組、層級關係等複雜的數據結構。
config.ini
[params]
a=1
b=2test_ini.py
import configparser
def test_ini():
cf = configparser.ConfigParser()
cf.read('config.ini')
a = cf['params']['a']
b = cf['params']['b']
print(a, b)
if __name__ == '__main__':
test_ini()
XMLXML(Extensible Markup Language)為可拓展標記語言,是一種用於標記電子文件使其具有結構性的標記語言,常被用於簡化Internet的文檔信息傳輸。類似於HTML,由多個帶層次結構的標籤組成。文檔的首行是聲明語句,內容由標籤組成,注釋用法同HTML。
優點
相比於INI來說,能表示非常複雜的層級關係。
缺點
太冗餘了~閱讀體驗不佳,不適合作配置文件。
config.xml
<?xml version="1.0"?>
<params>
<a>1</a>
<b>2</b>
</params>test_xml.py
import xml.etree.ElementTree as ET
def test_xml():
tree = ET.parse('config.xml')
root = tree.getroot()
a = root[0].text
b = root[1].text
print(a, b)
if __name__ == '__main__':
test_xml()
JSONJSON(JavaScript Object Notation,JS對象表示法)以易於讓人閱讀的文字為基礎,用來傳輸由屬性值或者序列性的值組成的數據對象。JSON的數據表示類似於Python的字典,解決了XML冗餘的問題,展示給用戶更直觀的數據結構。
優點
比 XML 更簡潔,閱讀體驗更佳。
缺點
雙引號太多,不適合做配置文件。
config.json
{
"params": {
"a": 1,
"b": 2
}
}test_json.py
import json
def test_json():
data = json.load(open('config.json'))
a = data['params']['a']
b = data['params']['b']
print(a, b)
if __name__ == '__main__':
test_json()
YAML👍YAML的可讀性比JSON更好,鍵值對不用加引號,視覺效果上更舒適。參考了Python的設計,注釋採用#號,層級關係用縮進表示。
優點
對JSON的進一步簡化。
缺點
暫時沒有發現什麼缺點。
config.yaml
params:
a: 1
b: 2test_yaml.py
import yaml
def test_yaml():
data = yaml.load(open('config.yaml'), Loader=yaml.FullLoader)
a = data['params']['a']
b = data['params']['b']
print(a, b)
if __name__ == '__main__':
test_yaml()
PY👍如果是使用Python編程,PY文件不失為一種好的選擇。PY是Python源碼後綴,在PY文件裡面定義字典可充當程序運行的配置文件。
優點
Python內部字典對象,無需解析,直接調用。
缺點
相比於YAML來說略顯冗餘,因為鍵需要引號。
config.py
params = {
'a': 1,
'b': 2
}test_py.py
from config import params
def test_py():
a = params['a']
b = params['b']
print(a, b)
if __name__ == '__main__':
test_py()
總結就使用Python語言編程的用戶來說,個人強烈推薦使用PY或YAML充當配置文件。PY裡面定義的字典變量無需解析,可以直接調用。YAML的數據表示非常簡潔直觀,同時也參考了Python語言設計的思想,更適合於Python用戶。
提示對於更加複雜的任務,命令行參數解析搭配配置文件使用更佳喔。例如深度學習訓練過程中,如果有多個訓練任務,那麼就需要寫多個配置文件,你只需在命令行參數裡面傳入配置文件所在的路徑,即可實現不同訓練任務的切換。
倉庫https://github.com/XavierJiezou/python-config-file
參考https://zh.wikipedia.org/wiki/INI文件
https://zh.wikipedia.org/wiki/XML
https://zh.wikipedia.org/wiki/JSON
https://zh.wikipedia.org/wiki/YAML