python中yaml文件之間、文件內部相互引用


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}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM