找回密码
 会员注册
查看: 41|回复: 0

python之yaml库使用总结

[复制链接]

2万

主题

0

回帖

7万

积分

超级版主

积分
71625
发表于 2024-9-6 15:59:05 | 显示全部楼层 |阅读模式
在Python中,YAML(YAMLAin'tMarkupLanguage)是一种人类友好的数据序列化格式。它被广泛用于配置文件、数据交换和存储等领域。YAML具有易读的语法,可以表示列表、字典和简单的数据类型。        在Python中,你可以使用PyYAML库来解析和生成YAML数据。1.安装        需要安装得模块名为pyyaml,直接pipinstallpyyaml        导入,直接importyaml2. yaml文件的格式及语法规则    yaml文件格式输出可以是列表,可以是字典,可以嵌套。层级关系用空格区分,切记,不支持tab缩进。        以下是YAML的基本语法规则:        2.1注释:使用井号(#)表示注释。井号后面的内容将被忽略。#这是一个注释key:value #这也是一个注释        2.2键值对:使用冒号(:)表示键值对,键和值之间使用空格分隔。key:value        2.3嵌套结构:可以使用缩进表示嵌套的结构,使用空格进行缩进。缩进的数量必须一致。parent_key:  child_key1:value1  child_key2:value2        2.4列表:使用短横线(-)表示列表项,每个列表项占一行,使用相同的缩进进行缩进。-item1-item2-item3        2.5字符串:可以使用单引号(')或双引号(")表示字符串。如果字符串中包含特殊字符或需要转义字符,则使用双引号。key:'value'key:"valuewithspecialcharacters:\n"        2.6多行字符串:使用竖线(|)可以表示多行字符串,保留字符串的换行符。key:|  Thisisa  multi-line  string.        2.7引用:可以使用&标记创建引用,并使用*标记引用的位置。引用可以用于在不同位置重复使用相同的值。defaults:&defaults  key1:value1  key2:value2user1:  <<: *defaults  name: John user2:  <<: *defaults  name: Jane         2.8 特殊值:YAML支持一些特殊的值,如布尔值(true、false)、null和时间戳等。 key1: truekey2: nullkey3: 2022-03-14T09:30:00Z         这些是YAML的基本语法规则。使用这些规则,你可以创建具有层次结构和灵活性的数据表示。请注意,缩进、空格和换行符在YAML中非常重要,因为它们用于表示结构和层次关系。 大小写敏感,Yam文件中true和false不区分大小写,其他区分大小写 使用缩进表示层级关系,缩进时不支持使用Tab键缩进,只允许使用空格。不需要关注缩进的空格数目,只要相同层级的元素左侧对齐即可多个文件用"- - -"来区分 2.9  示例         键值对形式: user: admin #字典键值对pwd: 123job: #job为列表  - teacher #列表中的项  - nurese #列表中的项 输出为:{'user': 'admin', 'pwd': 123, 'job': ['teacher', 'nurese']}          序列list: - admin1: 123456 # ‘-’:标示列表- admin2: 111111- admin3: 222222 输出:[{'admin1': 123456},      {'admin2': 111111},       {'admin3': 222222}]          纯量str: n1: 52.10输出:{'n1': 52.1} n2: true n3: false    #不区分大小写输出:{'n2': True, 'n3': False} #None用~表示n4: ~输出:{'n4': None}         Yam文件中true和false,不区分大小写,其他区分大小写。         强制转换: n7: !!str true #强制转换为字符串 !!str输出:{'n7': 'true'}  多个文件:         一个yaml文件里存在多个文件,用---表示,只能一起读取,不能分开读取。         下面内容为source.yaml文件中的内容。 ---user: adminpwd: ~job:  - teacher  - nurese ---school: erxiaolocation: sky 输出:{'user': 'admin', 'pwd': None, 'job': ['teacher', 'nurese']}{'school': 'erxiao', 'location': 'sky'}  3. yaml文件的读取         yYAML提供了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()函数加载数据。 '''多个文件'''import yaml #由于官方提示load方法存在安全漏洞,所以读取文件时会报错。加上warning忽略,就不会显示警告yaml.warnings({'YAMLLoadWarning':False}) f=open('source.yaml','r',encoding='utf-8')      #打开yaml文件cfg=f.read()d=yaml.load_all(cfg)     #将数据转换成python字典行驶输出,存在多个文件时,用load_all,单个的时候load就可以for data in d:    print(data)f.close()         输出:         {'user': 'admin', 'pwd': None, 'job': ['teacher', 'nurese']}         {'school': 'erxiao', 'location': 'sky'} 读单个文件,使用yaml.load() 或 yaml.safe_load()函数。 '''单个文件''' '''yaml文件内容:user: adminpwd: ~job:  - teacher  - nurese''' yaml.warnings({'YAMLLoadWarning':False})f=open('source.yaml','r',encoding='utf-8')cfg=f.read()print(cfg)d=yaml.load(cfg)print(d)f.close() 输出:         {'user': 'admin', 'pwd': None, 'job': ['teacher', 'nurese']}         总而言之,load函数和safe_load函数都可以用于将YAML数据加载为Python对象。load函数支持所有YAML功能,但可能存在安全风险。而safe_load函数则更加安全,但功能受到限制。选择使用哪个函数取决于你对YAML数据的信任程度以及你是否需要支持复杂的自定义类型。 4. yaml文件的写入 import yamlimport os def yaml_doc(yampath):      data={'school':'erxiao',            'studens':['lili','jj']}      file=open(yampath,'w',encoding='utf-8') #w: 覆盖写入      yaml.dump(data, file)      file.close()currentpath = os.path.abspath('.')     #获取当前路径yamlpath = os.path.join(currentpath, 'generate.yaml')    #创建yaml文件yaml_doc(yamlpath)         输出:                 generate.yaml文件,内容为: school: erxiaostudens:  - lili  - jj 5. 总结         本章详细介绍了yaml文件的格式及语法内容,并给出了代码示例。另外详细介绍yaml文件的加载,介绍了load和safe_load 的使用注意事项并进行单文件以及多文件加载的示例演示。最后给出了介绍了yaml文件写入的方法。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-10 05:46 , Processed in 0.828398 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表