【python】yaml文件的处理

1 yaml文件说明

1.1 yaml文件规则

  • 区分大小写; 使用缩进表示层级关系;
  • 使用空格键缩进,而非Tab键缩进 缩进的空格数目不固定,只需要相同层级的元素左侧对齐;
  • 文件中的字符串不需要使用引号标注,但若字符串包含有特殊字符则需用引号标注;
  • 注释标识为 #
  • 多个文档在一个yaml文件,使用 - - - (中间不要空格)分隔方式来分段

1.2 yaml文件数据结构

  • 对象:键值对的集合(简称 “映射或字典”)
    键值对用冒号 “:” 结构表示,冒号与值之间需用空格分隔
  • 数组:一组按序排列的值(简称"序列或列表")
    数组前加有 “-” 符号,符号与值之间需用空格分隔
  • 纯量(scalars):单个的、不可再分的值(如:字符串、bool值、整数、浮点数、时间、日期、null等)
    None值可用null可 ~表示

2 pyyaml常用函数

(1)yaml.load()
该函数解析流中的第一个YAML 文档,并生成相应的 Python 对象。
(a)键值对集合转化为python的字典对象
yaml文件格式如下:

key1:
  key2: value1

转化为python的字典对象,格式如下:

{'key1': {'key2': 'value1'}}

(b)序列/列表转化为python的列表对象
yaml文件格式如:

- 1
- 2
- 3
- 4

转化为python的列表对象,格式如下:

[1,2,3,4]

(c)空yaml文件转化为python的None
yaml文件格式如:

#为空的yaml文件

转化为python的None,格式如下:

None

(d)整数转化为python的int对象,其他字符串、bool值、整数、浮点数、日期时间、日期等同数值类似
yaml文件格式如:

1

转化为python的int对象,格式如下:

1

(2)yaml.dump()
该函数将python对象序列化为YAML 流,如果流为 None,则改为返回生成的字符串。

(3)yaml.load_all()
解析流中的所有 YAML 文档并生成相应的 Python 对象。
yaml文件格式如:

animal1: dog
age: 2
---
animal2: cat
age: 3

利用python可对每个yaml文档生成相应的python对象

file=open('test.yaml','r')
dict = yaml.load_all(file.read(),Loader=yaml.FullLoader)
for key in dict:
 	print(key)

#输出内容如下:
{'animal1': 'dog', 'age': 2}
{'animal2': 'cat', 'age': 3}

(4)yaml.dump_all()
python代码如下所示:

file = open('test.yaml','w')
param = {
        'key1':{
            'key2':'12'
        },
        'key3':[1,2,3,4,5,6]
    }
    param1={
        'key4':444
    }
    yaml.dump_all([param,param1],file)

转化的yaml文件格式为:

key1:
  key2: '12'
key3:
- 1
- 2
- 3
- 4
- 5
- 6
---
key4: 444

注:1)在yaml.dump()和yaml.dump_all()函数中添加file文件,则可直接将内容写入文件中,格式如:yaml.dump_all(params,file)
2)yaml.dump_all()函数中若需要在一个文件中写入多个yaml文件,则参数可用列表表示,格式如:yaml.dump_all([param,param1],file)

3 常见问题

(1)使用yaml.load()时报错 TypeError: load() missing 1 required positional argument: ‘Loader’

记录原因:
YAML 5.1版本后弃用了yaml.load(file)这个用法,因为觉得很不安全,5.1版本之后就修改了需要指定Loader,通过默认加载​​器(FullLoader)禁止执行任意函数,该load函数也变得更加安全

用以下方式都可以解决上述问题

d1=yaml.load(file,Loader=yaml.FullLoader)
d1=yaml.safe_load(file)
d1 = yaml.load(file, Loader=yaml.CLoader)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值