我刚开始写Python程序的时候,配置文件就让我纠结了好久。那时候总觉得JSON挺好用的,后来发现YAML也很流行,到底选哪个呢?
先说JSON。JSON的语法特别严格,每个键值对都要用双引号包起来,不能有多余的逗号。这种严格其实是优点,因为一旦写错了,程序立马告诉你哪里出问题了。Python标准库自带的json模块用起来也简单,两行代码就能把配置文件读进来。比如你有一个config.json文件:
{
'server': {
'host': 'localhost',
'port': 8080
},
'logging': {
'level': 'debug'
}
}
用Python加载就是:
import json
with open('config.json', 'r') as f:
config = json.load(f)
再来说YAML。YAML的写法更像是在写笔记,不需要双引号,用缩进来表示层级结构。比如同一个配置用YAML写:
server:
host: localhost
port: 8080
logging:
level: debug
看着是不是清爽很多?但YAML有个问题,它极度依赖缩进。你少敲一个空格或者缩进不一致,程序就读不出来。而且Python要加载YAML,得装第三方库pyyaml,不过安装也很简单,pip install pyyaml就行。加载方式类似:
import yaml
with open('config.yaml', 'r') as f:
config = yaml.safe_load(f)
注意这里用的是safe_load,不是load。用safe_load是为了安全,防止别人在YAML文件里写恶意代码。
那到底哪个更适合你呢?得看你的场景。
如果你的配置文件比较小,只有几项设置,而且你希望别人一眼就能看懂,YAML是更好的选择。举个例子,如果你写个小工具,需要配置数据库连接、日志级别这些,用YAML写出来就像读说明书一样舒服。很多开源项目比如Docker、Kubernetes都用YAML,也是因为这个原因。
如果你的配置文件可能会被别的程序读取,或者你需要频繁地在配置里写复杂的数据结构比如数组套对象,JSON更稳妥。JSON在不同语言之间传递数据特别方便。几乎所有编程语言都有内置的JSON解析器,这个优势是YAML比不了的。
还需要考虑一点:团队协作中用哪个更方便。如果你同事里有人不熟悉YAML,他们可能会搞错缩进结构,导致配置文件报错。JSON虽然写起来费劲一点,但格式错了也容易发现。我见过一个团队因为YAML缩进问题吵了好几次,后来干脆改成JSON了。
性能方面其实不用太纠结。对于大多数个人项目或者小团队来说,加载配置文件的时间几乎可以忽略不计。除非你的配置文件有几十兆大小,否则感觉不出差别。
我个人的做法是写个人项目用YAML,因为自己一个人用,格式自由看着舒服。要跟同事协作或者给别人用的工具,我就用JSON,省得出问题被投诉。
说到底,没有哪个绝对的好,只有哪个更适合你现在这个任务。你可以两个都试试,写一个小的测试程序,分别用JSON和YAML加载同一个配置内容,看看哪个更顺手。只有自己上手用过,才知道哪个顺心。