文章目录

  • 引言
  • INI
  • XML
  • JSON
  • YAML👍
  • PY👍
  • 总结
  • 提示
  • 仓库
  • 参考



引言

配置文件常为程序运行提供参数,为参数的统一管理提供便利。本文以Python语言为例,讲解各种配置文件的用法。

INI

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

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

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👍

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()

PY👍

如果是使用Python编程,PY文件不失为一种好的选择。PYPython源码后缀,在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语言编程的用户来说,个人强烈推荐使用PYYAML充当配置文件。PY里面定义的字典变量无需解析,可以直接调用。YAML的数据表示非常简洁直观,同时也参考了Python语言设计的思想,更适合于Python用户。

提示

对于更加复杂的任务,命令行参数解析搭配配置文件使用更佳喔。例如深度学习训练过程中,如果有多个训练任务,那么就需要写多个配置文件,你只需在命令行参数里面传入配置文件所在的路径,即可实现不同训练任务的切换。