本文主要介绍Python中Pyyaml模块的使用,给大家讲的很详细,对大家的学习或者工作都有一定的参考价值。有需要的朋友可以参考一下。
一、YAML是什么
YAML是一种专门编写配置文件的语言,远比JSON格式方便。
YAML语言的设计目标是方便人类阅读和写作。
YAML是一种比XML和JSON更轻便的文件格式,也更简单、更强大。它可以通过缩进来表达结构。听起来像Python吗?
顾名思义,用各种语言编写的文件可以称为YAML文件。PyYaml是一个专门用于Yaml文件操作的Python模块,使用起来非常简单。
如果是py2,使用pip install yaml。
二、PyYaml的简单使用
用起来很简单,就像json和pickle一样。加载和转储足够我们使用。
Load()示例:返回一个对象
导入yaml
yaml_str=' ' '
名称:一条大河
年龄:1956年
工作:歌手
'''
y=yaml.load(yaml_str,Loader=yaml。安全加载程序)
打印(y)
运行结果:
{《名字》:《一条大河》,《年龄》:1956年,《工作》:《歌手》}
load_all()示例:生成一个迭代器
如果一个字符串或文件包含几个yaml文档,可以使用yaml.load_all解析所有文档。
Yaml_test.yaml文件内容:
-
姓名:祁雨
年龄:20岁
-
名称:青青
年龄:19岁
用于操作yaml文件的Test.py文件如下:
导入yaml
带开('。/yaml_test ',' r ',encoding='utf-8 ')作为ymlfile:
cfg=yaml.load_all(ymlfile,Loader=yaml。安全加载程序)
对于cfg中的数据:
打印(数据)
运行结果:
{ '姓名': '齐豫','年龄':' 20岁' }
{ '姓名': '青青','年龄':' 19岁' }
Dump()示例:将python对象生成为yaml文档
导入yaml
Json_data={'name ':'一条大河',
“年龄”:1956年,
job': ['歌手','舞者']}
y=yaml.dump(json_data,default_flow_style=False)。编码(' utf-8 ')。解码(“unicode_escape”)
打印(y)
运行结果:
年龄:1956年
工作:
歌手
-舞者
名称:“一条大河”
使用dump()输入参数,您可以直接将内容写入yaml文件:
导入yaml
Json_data={'name ':'一条大河',
“年龄”:1956年,
job': ['歌手','舞者']}
带开('。/yaml_write.yaml ',' w ')作为f:
y=yaml.dump(json_data,f)
打印(y)
Yaml_write.yaml写完内容:
Yaml.dump_all()示例:将多个段输出到一个文件
导入yaml
obj1={'name': 'river ',' age': 2019}
obj2=['莉莉',1956]
obj3={ '刚':'本','时代':1963}
obj4=[《朱祁钰》,1994年]
带开('。/yaml_write_all.yaml ',' w ',encoding='utf-8 ')作为f:
y=yaml.dump([obj1,obj2,obj3,obj4],f)
打印(y)
带开('。/yaml_write_all.yaml ',' r ')作为r:
y1=yaml.load(r,Loader=yaml。安全加载程序)
打印(y1)
Yaml_write_all.yaml写完后:
为什么写文件后的格式有的是1 "-"有的是2 "-"?
为什么yaml文件的格式读作List?
三、YAML的语法规则和数据结构
看完以上四个简单的例子,我们来总结一下YAML语的基本句法。
YAML的基本语法规则如下:
1,区分大小写
2.缩进是用来表达层次关系的。
3.缩进时不允许使用Tab键,只允许使用空格。
4.缩进空格的数量无关紧要,只要同一级别的元素的左侧对齐即可。
5.#表示注释,解析器将忽略从该字符到行尾的注释。这和python注释是一样的。
6.列表中的项目用'-'表示,字典中的键值对用':'分隔
知道了语法规则,现在让我们来回答上面的两个问题:
1.一个“-”表示不同的模块(单个数组或字典),两个“-”是因为数组中的元素以“-”开头,加上表示不同模块的“-”,就成了两个“-”
2.因为yaml文件包含多个模块(多个数组或字典),所以读出的是这些模块的集合。
3.是且仅当yaml文件中只有一个字典时,读出的数据类型也是字典。
YAML 支持的数据结构有3种:
1.Object:键值对的集合。
2.数组:按顺序排列的一组值,一个序列或一个列表。
3、纯量(标量):单个的、不可再分的值,如:字符串、布尔值、整数、浮点数、空值、时间、日期
支持数据示例:
yaml _测试_数据的内容:
字符串:'大河' #字符串
int: 1548 #整数
浮子:3.14 #浮点数
布尔值:真#布尔值
无:空#也可以用~号来表示空
时间:' 2019-11-20t 08:47:46.576701 00:00 ' #时间,ISO8601
日期:2019-11-20 16:47:46.576702 #日期
操作代码:
导入yaml
导入日期时间
进口pytz
yaml_data={
字符串':'大河,
' int': 1548,
浮动':3.14,
'布尔:真,
'无:无,
' time ':日期时间。日期时间。现在(tz=pytz。时区(“UTC”).isoformat(),
' date': datetime.datetime.today()
}
带开('。/yaml_test ',' w ')作为女:
y=yaml.dump(yaml_data,f)
打印(y)
带开('。/yaml_test ',' r ')作为r:
y1=yaml.load(r,Loader=yaml .安全加载程序)
打印(y1)
控制台输出:
其他语法规则
1、如果字符串没有空格或特殊字符,不需要加引号,但如果其中有空格或特殊字符,就需要加引号了
2、引用
和* 用于引用
姓名:姓名station-keeping position 编队位置
测试人员:*姓名
运行结果:
{ '姓名:“SKP”测试者:' SKP'}
3、强制转换
用!实现
str:str 3.14
int:int '123 '
运行结果:
{'int': 123,' str': '3.14'}
4、分段
在同一个yaml文件中,可以用"—"3个"-"来分段,这样可以将多个文档写在一个文件中
举例见上述load_all()示例
四、python对象生成yaml文档
1、yaml.dump()方法
导入yaml
导入操作系统
def generate_yaml_doc(yaml_file):
py_object={'school ':'朱,
学生:['a ',' b']}
file=open(yaml_file,' w ',encoding='utf-8 ')
yaml.dump(py_object,file)
file.close()
current_path=os.path.abspath(' . ')))
YAML路径=操作系统。路径。join(current _ path,' generate.yaml ')
生成_yaml_doc(yaml_path)
'''结果
学校:朱
学生:
[构成动植物的古名或拉丁化的现代名]
-乙
'''
2、使用ruamel模块中的yaml方法生成标准的yaml文档
导入操作系统
从鲁阿梅尔导入yaml # pip3安装ruamel.yaml
def generate _ YAML _ doc _鲁阿梅尔(YAML _文件):
py_object={'school ':'朱,
学生:['a ',' b']}
file=open(yaml_file,' w ',encoding='utf-8 ')
yaml.dump(py_object,file,Dumper=yaml .往返转储)
file.close()
current_path=os.path.abspath(' . ')))
YAML路径=操作系统。路径。join(current _ path,' generate.yaml ')
生成_yaml_doc_ruamel(yaml_path)
'''结果
学校:朱
学生:
[构成动植物的古名或拉丁化的现代名]
-乙
'''
使用鲁阿梅尔模块中的yaml方法读取yaml文档(用法与单独导入yaml模块一致)
导入操作系统
从鲁阿梅尔进口yaml
def get _ YAML _数据_鲁阿梅尔(YAML _文件):
file=open(yaml_file,' r ',encoding='utf-8 ')
data=yaml.load(file,Loader=yaml .装载机)
file.close()
打印(数据)
current_path=os.path.abspath(' . ')))
YAML路径=操作系统。路径。join(current _ path,' generate.yaml ')
get_yaml_data_ruamel(yaml_path)
到此这篇关于计算机编程语言中Pyyaml模块的使用的文章就介绍到这了,更多相关计算机编程语言中Pyyaml模块内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。