1.目錄結構
|--------a
|----a.yaml
|----b.yaml
|--------c
|----c.yaml
|--------yaml_include.py
2.代碼實現yaml_include.py
import yaml
import os.path
class Loader(yaml.Loader):
def __init__(self, stream):
self._root = os.path.split(stream.name)[0]
super(Loader, self).__init__(stream)
def include(self, node):
filename = os.path.join(self._root, self.construct_scalar(node))
with open(filename, 'r') as fr:
return yaml.load(fr, Loader)
Loader.add_constructor('!include', Loader.include)
def load_yaml(file_name):
"""Load YAML file to be dict"""
if os.path.exists(file_name):
with open(file_name, 'r', encoding="utf-8") as fr:
dict_obj = yaml.load(fr, Loader=Loader)
return dict_obj
else:
raise FileNotFoundError('NOT Found YAML file %s' % file_name)
if __name__ == '__main__':
yaml_dict = load_yaml("a/a.yaml")
print(yaml_dict)
3.yaml文件之間相互引用
a.yaml
name: demo
hobby: !include ./b.yaml # 引用當前目錄下yaml文件
skill: !include ../c/c.yaml # 引用非當前目錄下的yaml文件
b.yaml
- basketball
- Table-Tennis
- swim
c.yaml
- python
- java
- shell
- linux
打印結果:
{
"hobby": ["basketball", "Table-Tennis", "swim"],
"name": "demo",
"skill": ["python", "java", "shell", "linux"]
}
4.yaml文件內部引用
a.yaml
name: demo
maodiao1: &maodian1 # &符號標記錨點1
a: 1
b: 2
maodiao2: &maodian2 # &符號標記錨點2
aa: 11
bb: 22
haha:
<<: *maodian1 # 方式一:使用 <<: * 符號引用
heihei: *maodian2 # 方式二:直接使用*號引用
打印結果:
{
"name": "demo",
"maodiao1": {"a": 1, "b": 2},
"maodiao2": {"aa": 11, "bb": 22},
"haha": {"a": 1,"b": 2},
"heihei": {"aa": 11,"bb": 22}
}
5. 文件之間與文件內部混合引用
a.yaml
name: demo
maodian1: &maodian1 # &符號標記錨點1
hobby: !include ./b.yaml # 引用當前目錄下yaml文件
skill: !include ../c/c.yaml # 引用非當前目錄下的yaml文件
maodiao2: &maodian2 # &符號標記錨點2
aa: 11
bb: 22
haha:
<<: *maodian1 # 方式一:使用 <<: * 符號引用
heihei: *maodian2 # 方式二:直接使用*號引用
b.yaml
- basketball
- Table-Tennis
- swim
c.yaml
- python
- java
- shell
- linux
打印結果
{
"name": "demo",
"maodian1": {
"hobby": ["basketball", "Table-Tennis", "swim"],
"skill": ["python", "java", "shell", "linux"]
},
"maodiao2": {"aa": 11,"bb": 22},
"haha": {
"hobby": ["basketball", "Table-Tennis", "swim"],
"skill": ["python", "java", "shell", "linux"]
},
"heihei": {"aa": 11,"bb": 22}
}