1.安装
在终端中输入如下命令
pip install pyyaml
2.格式
yaml的语法一般为key: value
的形式,冒号后有且仅有一个空格,对大小写敏感,字符串不必使用引号。
例如:
name: Tom
age: 8
当一个key
有多个属性时,可以写成如下形式,缩进一般为两个空格,且不能使用TAB
:
score:
math: 98
english: 94
chinese: 99
3.读取
假设有一个yaml文件,里面的内容如下:
name: Tom
age: 8
score:
math: 98
english: 94
chinese: 99
一般我们会使用yaml.safe_load()
import yaml
filepath = 'config.yaml'
with open(filepath) as f:
cfg = yaml.safe_load(f)
print(cfg)
最终数据会以字典的形式存入变量中,打印的结果如下所示:
{'name': 'Tom', 'age': 8, 'score': {'math': 98, 'english': 94, 'chinese': 99}}
如果我们希望将yaml文件中的数据存放在python的两个变量中,则可以使用---
将数据分割开:
age: 8
name: Tom
score:
chinese: 99
english: 94
math: 98
---
age: 8
name: Jerry
score:
chinese: 97
english: 78
math: 87
使用yaml.safe_load_all()
进行读取:
import yaml
filepath = 'data.yaml'
with open('data.yaml', 'r') as f:
cfg = yaml.safe_load_all(f)
for data in cfg:
print(data)
输出结果如下:
{'age': 8, 'name': 'Tom', 'score': {'chinese': 99, 'english': 94, 'math': 98}}
{'age': 8, 'name': 'Jerry', 'score': {'chinese': 97, 'english': 78, 'math': 87}}
4.保存
yaml文件的格式后缀.yaml
和.yml
都可以,这里我们使用.yaml
import yaml
cfg = {
'name': 'Tom',
'age': 8,
'score': {'math': 98, 'english': 94, 'chinese': 99}
}
with open('data.yaml', 'w', encoding='utf-8') as f:
yaml.safe_dump(cfg, f)
最终会生成一个data.yaml
文件,内容如下:
age: 8
name: Tom
score:
chinese: 99
english: 94
math: 98
还有一个yaml.safe_dump_add()
命令,它可以将多个数据保存到一个yaml
文件中,如下:
import yaml
cfg1 = {
'name': 'Tom',
'age': 8,
'score': {'math': 98, 'english': 94, 'chinese': 99}
}
cfg2 = {
'name': 'Jerry',
'age': 8,
'score': {'math': 87, 'english': 78, 'chinese': 97}
}
with open('data.yaml', 'w', encoding='utf-8') as f:
yaml.safe_dump_all([cfg1, cfg2], f)
最终保存文件的内容如下:
age: 8
name: Tom
score:
chinese: 99
english: 94
math: 98
---
age: 8
name: Jerry
score:
chinese: 97
english: 78
math: 87
5.优雅的使用字典
字典调用里面的变量比较麻烦data['name']
,如果我们像简便一点data.name
,则需要使用到包easydict
,安装如下:
pip install easydict
假设我们有一个yaml文件data.yaml
,内容如下:
age: 8
name: Tom
score:
chinese: 99
english: 94
math: 98
则读取代码可以写为:
import yaml
from easydict import EasyDict as edict
filepath = 'data.yaml'
with open('data.yaml', 'r') as f:
cfg = yaml.safe_load(f)
data = edict(cfg)
print(data.name)
print(data.score)
输出如下:
Tom
{'chinese': 99, 'english': 94, 'math': 98}