• python 之yaml库使用总结


            在Python中,YAML(YAML Ain't Markup Language)是一种人类友好的数据序列化格式。它被广泛用于配置文件、数据交换和存储等领域。YAML具有易读的语法,可以表示列表、字典和简单的数据类型。

            在Python中,你可以使用PyYAML库来解析和生成YAML数据。

    1.安装

            需要安装得模块名为pyyaml,直接pip install pyyaml

            导入,直接import yaml

    2. yaml文件的格式及语法规则

            yaml文件格式输出可以是列表,可以是字典,可以嵌套。层级关系用空格区分,切记,不支持tab缩进。

            以下是YAML的基本语法规则:

            2.1 注释:使用井号(#)表示注释。井号后面的内容将被忽略。

    1. # 这是一个注释
    2. key: value  # 这也是一个注释

            2.2 键值对:使用冒号(:)表示键值对,键和值之间使用空格分隔。

    key: value

            2.3 嵌套结构:可以使用缩进表示嵌套的结构,使用空格进行缩进。缩进的数量必须一致。

    1. parent_key:
    2.   child_key1: value1
    3.   child_key2: value2

            2.4 列表:使用短横线(-)表示列表项,每个列表项占一行,使用相同的缩进进行缩进。

    1. - item1
    2. - item2
    3. - item3

            2.5 字符串:可以使用单引号(')或双引号(")表示字符串。如果字符串中包含特殊字符或需要转义字符,则使用双引号。

    1. key: 'value'
    2. key: "value with special characters: \n"

            2.6 多行字符串:使用竖线(|)可以表示多行字符串,保留字符串的换行符。

    1. key: |
    2.   This is a
    3.   multi-line
    4.   string.

            2.7 引用:可以使用&标记创建引用,并使用*标记引用的位置。引用可以用于在不同位置重复使用相同的值。

    1. defaults: &defaults
    2.   key1: value1
    3.   key2: value2
    4. user1:
    5.   <<: *defaults
    6.   name: John
    7. user2:
    8.   <<: *defaults
    9.   name: Jane

            2.8 特殊值:YAML支持一些特殊的值,如布尔值(true、false)、null和时间戳等。

    1. key1: true
    2. key2: null
    3. key3: 2022-03-14T09:30:00Z

            这些是YAML的基本语法规则。使用这些规则,你可以创建具有层次结构和灵活性的数据表示。请注意,缩进、空格和换行符在YAML中非常重要,因为它们用于表示结构和层次关系。

    • 大小写敏感Yam文件中true和false不区分大小写,其他区分大小写
    • 使用缩进表示层级关系缩进时不支持使用Tab键缩进,只允许使用空格。不需要关注缩进的空格数目,只要相同层级的元素左侧对齐即可
    • 多个文件用"- - -"来区分

    2.9  示例

            键值对形式:

    1. user: admin #字典键值对
    2. pwd: 123
    3. job: #job为列表
    4.   - teacher #列表中的项
    5.   - nurese #列表中的项
    6. 输出为:{'user': 'admin', 'pwd': 123, 'job': ['teacher', 'nurese']}

             序列list:

    1. - admin1: 123456 # ‘-’:标示列表
    2. - admin2: 111111
    3. - admin3: 222222
    4. 输出:[{'admin1': 123456},
    5.       {'admin2': 111111},
    6.       {'admin3': 222222}]

             纯量str:

    1. n1: 52.10
    2. 输出:{'n1': 52.1}
    3. n2: true
    4. n3: false    #不区分大小写
    5. 输出:{'n2': True, 'n3': False}
    6. #None用~表示
    7. n4: ~
    8. 输出:{'n4': None}

            Yam文件中true和false,不区分大小写,其他区分大小写。

            强制转换:

    1. n7: !!str true #强制转换为字符串 !!str
    2. 输出:{'n7': 'true'}

     多个文件:

            一个yaml文件里存在多个文件,用---表示,只能一起读取,不能分开读取。

            下面内容为source.yaml文件中的内容。

    1. ---
    2. user: admin
    3. pwd: ~
    4. job:
    5.   - teacher
    6.   - nurese
    7. ---
    8. school: erxiao
    9. location: sky
    10. 输出:
    11. {'user': 'admin', 'pwd': None, 'job': ['teacher', 'nurese']}
    12. {'school': 'erxiao', 'location': 'sky'}

     3. yaml文件的读取

            PyYAML提供了load和safe_load这两个函数来将YAML数据加载为Python对象。它们之间的主要区别在于安全性。

            load函数:load函数用于将YAML数据加载为Python对象。它接受一个文件对象或包含YAML数据的字符串作为输入,并返回相应的Python对象。load函数支持YAML中的所有功能,包括自定义类型和标记

            safe_load函数:safe_load函数也用于将YAML数据加载为Python对象,但它具有更多的安全性措施。safe_load函数只支持加载基本的Python数据类型,如字典、列表、字符串、整数、浮点数等。它不支持自定义类型和标记。

            safe_load函数可以帮助防止通过恶意构造的YAML数据执行任意代码。因此,当你不确定YAML数据的来源时,最好使用safe_load函数。

    读多个文件示例,使用yaml.load_all()函数加载数据。

    1. '''多个文件'''
    2. import yaml
    3. #由于官方提示load方法存在安全漏洞,所以读取文件时会报错。加上warning忽略,就不会显示警告
    4. yaml.warnings({'YAMLLoadWarning':False})
    5. f=open('source.yaml','r',encoding='utf-8')      #打开yaml文件
    6. cfg=f.read()
    7. d=yaml.load_all(cfg)     #将数据转换成python字典行驶输出,存在多个文件时,用load_all,单个的时候load就可以
    8. for data in d:
    9.     print(data)
    10. f.close()

            输出:

            {'user': 'admin', 'pwd': None, 'job': ['teacher', 'nurese']}

            {'school': 'erxiao', 'location': 'sky'}

    读单个文件,使用yaml.load() 或 yaml.safe_load()函数。

    1. '''单个文件'''
    2. '''yaml文件内容:
    3. user: admin
    4. pwd: ~
    5. job:
    6.   - teacher
    7.   - nurese
    8. '''
    9. yaml.warnings({'YAMLLoadWarning':False})
    10. f=open('source.yaml','r',encoding='utf-8')
    11. cfg=f.read()
    12. print(cfg)
    13. d=yaml.load(cfg)
    14. print(d)
    15. f.close()

    输出:

            {'user': 'admin', 'pwd': None, 'job': ['teacher', 'nurese']}

            总而言之,load函数和safe_load函数都可以用于将YAML数据加载为Python对象。load函数支持所有YAML功能,但可能存在安全风险。而safe_load函数则更加安全,但功能受到限制。选择使用哪个函数取决于你对YAML数据的信任程度以及你是否需要支持复杂的自定义类型。

    4. yaml文件的写入

            使用yaml.dump()函数写入文件。open文件使用‘w’ 选项会覆盖原文件,使用‘a’选择则会在文件尾追加写入,更多选项请查看该文章链接中的open部分关于打开选项的介绍。https://blog.csdn.net/yueguang8/article/details/136383215?spm=1001.2014.3001.5501

    1. import yaml
    2. import os
    3. def yaml_doc(yampath):
    4.       data={'school':'erxiao',
    5.             'studens':['lili','jj']}
    6.       file=open(yampath,'w',encoding='utf-8') #w: 覆盖写入
    7.       yaml.dump(data, file)
    8.       file.close()
    9. currentpath = os.path.abspath('.')     #获取当前路径
    10. yamlpath = os.path.join(currentpath, 'generate.yaml')    #创建yaml文件
    11. yaml_doc(yamlpath)

            输出:

                    generate.yaml文件,内容为:

    1. school: erxiao
    2. studens:
    3.   - lili
    4.   - jj

    5. 总结

            本章详细介绍了yaml文件的格式及语法内容,并给出了代码示例。另外详细介绍yaml文件的加载,介绍了load和safe_load 的使用注意事项并进行单文件以及多文件加载的示例演示。最后给出了介绍了yaml文件写入的方法。

  • 相关阅读:
    微服务项目:尚融宝(38)(核心业务流程:申请借款额度(2))
    远程桌面管理软件,如何使用远程桌面管理软件来远程控制服务器
    手把手教你构建一个前端路由
    gRPC之gRPC流
    【面向对象】理解面向对象编程中的封装性
    分组后成员的再分组
    从低代码的前世今生,看软件开发趋势
    手拉手一起学HTML(下)——表格标签和列表标签,表单标签
    【2023,学点儿新Java-51】变量与运算符 (阶段性复习3):常用运算符回顾之比较运算符、逻辑运算符、条件运算符、了解位运算符 | 网络工程师面试题:详细解释一下网关、子网和路由表的概念和作用
    【C++】map&set的底层结构 -- AVL树(高度平衡二叉搜索树)
  • 原文地址:https://blog.csdn.net/yueguang8/article/details/136714526