配置文件常为程序运行提供参数,为参数的统一管理提供便利。本文以Python语言为例,讲解各种配置文件的用法。
INI取自英文initialization(初始)的首字缩写,常常使用在Windows操作系统上,由节、键、值组成。节用[section]
表示,键值用=
连接,注释用;
,不同节间一般用空行分隔。
优点
面向大众,简洁易懂,非专业人员也能看懂。
缺点
无法表现数组、层级关系等复杂的数据结构。
config.ini
[params]
a=1
b=2
test_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()
XML(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()
JSON(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的可读性比JSON更好,键值对不用加引号,视觉效果上更舒适。参考了Python的设计,注释采用#
号,层级关系用缩进表示。
优点
对JSON的进一步简化。
缺点
暂时没有发现什么缺点。
config.yaml
params:
a: 1
b: 2
test_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()
如果是使用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://zh.wikipedia.org/wiki/INI文件
https://zh.wikipedia.org/wiki/XML
https://zh.wikipedia.org/wiki/JSON
https://zh.wikipedia.org/wiki/YAML